线程

线程

在一个进程中,一个线程有生有死,若要线程不死不灭,那么需要一个死循环,但是如果由线程不断的轮询任务是否存在,则太耗费性能,所以引入 运行循环 来为线程监听事件。如果没有监听到事件时,就使线程休眠。

发出事件的称为事件源,事件源可以分为输入源和定时源。

脱离/独立线程可连接/非独立线程

一般而言,应用程序的主线程都是以非独立的方式创建的,而其他可选的工作都是创建独立线程进行处理。当程序被退出时,通常立即中断独立线程,所以如果需要后台线程在应用程序终止时,来将数据保存到硬盘或进行其他周期性的任务时,需要将这些线程创建为非独立的(可连接线程)。

所谓线程安全,就是要保证临界区资源的安全访问。对于自定义的类库,应假设引用该库的应用是使用了多线程技术的。如此,应当在设计类库时,要为临界区的资源加锁,而不是依赖调用类库的代码提供线程安全环境。

虽然可以通过注册 NSDidBecomeSingleThreadedNotificationNSWillBecomeMultiThreadedNotification 通知来监听应用是否使用了多线程技术,但是不宜通过接收该通知来判定是否为临界区加锁。因为在注册通知之前,通知可能已经发送过了。

在 Mac OS X 和 iOS 中提供了基于 C 语言的 POSIX(Portable Operating System Interface,X 表示是 UNIX 操作系统的接口)线程接口。如果直接使用 pthread_create 函数创建线程,得到的线程默认是可连接的,所以可以使用 pthread_attr_setdetachstate 函数设置 PTHREAD_CREATE_DETACHED 脱离线程标记,修改创建线程时的配置。

如果只是使用 POSIX 接口来创建多线程,那么需要注意的是 Cocoa 框架的保护,因为创建锁对于单线程程序是不必要的,也是浪费性能的,所以 Cocoa 框架中直到使用 NSThread 类创建第一个新的线程时,才会创建相应的锁。但是,使用 POSIX 接口创建新的线程时,Cocoa 并不会收到应用程序当前变成为多线程的通知。为了防止多线程破坏 Cocoa 框架的安全性,可以使用 NSThread 类主动创建一个空任务的线程。

输入源自定义源

向自定义模式中添加自定义源,然后使用该模式开启一个运行循环,从而监听添加的自定义事件源发出的事件。

输入源异步发送消息给线程,基于端口的输入源由系统内核自动发送,而自定义的输入源则需要人工从其他线程发送。

对于基于端口的源,可以直接创建 NSPort 实例对象,然后将其添加到相关的运行循环中。

对于自定义的输入源则需要使用 CFRunLoopSourceRef 类相关的函数创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值