介绍一下 NSCondition
- NSCondition类是互斥锁和条件锁的结合体。需要注意的是,由于操作系统实现的差异,即使在代码中没有发送signal消息,线程也有可能被唤醒,所以需要增加谓词变量来保证程序的正确性。
- 代码介绍
NSConditon *condition =[[NSCondition alloc] init];
//一般用于多线程同时访问、修改同一个数据源,保证在同一时间内数据源只被访问、修改一次,其他线程的命令需要在lock 外等待,只到unlock ,才可访问
[condition lock];
//与lock 同时使用
[condition unlock];
//让当前线程处于等待状态
[condition wait];
//CPU发信号告诉线程不用在等待,可以继续执行
[condition signal];
有一点要说明的是,[condition lock]
虽然可以对当前代码段的数据源上锁,但是如果同时使用了[condition wait]
阻塞线程,其他的线程是可以通过[condition signal]
恢复线程来继续访问这段数据源。这也就是定义中提到的
一个线程在等待信号而阻塞时,可以被另外一个线程唤醒。这一点和线程上锁后数据不能被其他数据访问,并不冲突
应用示例
- 创建线程锁并开启线程等待
NSCondition *cocoaCondition = [[NSCondition alloc] init];
[cocoaCondition lock];
while (timeToDoWork <= 0)
[cocoaCondition wait];
timeToDoWork--;
// Do real work here.
//
[cocoaCondition unlock];
- 在其他线程中唤醒:
[cocoaCondition lock];
timeToDoWork++;
[cocoaCondition signal];// 通知线程恢复
[cocoaCondition unlock];