我正在查看NSCondition documentation示例,并有点困惑:
无论何时使用条件对象,第一步都是锁定 条件。锁定条件可确保您的谓词和任务 使用相同的代码保护代码免受其他线程的干扰 条件。完成任务后,您可以设置其他任务 根据代码的需要预测或发出其他信号。 您应始终在保持时设置谓词和信号条件 条件对象的锁定。
清单4-3使用Cocoa条件
[cocoaCondition lock];
while (timeToDoWork <= 0)
[cocoaCondition wait];
timeToDoWork--;
// Do real work here.
[cocoaCondition unlock];
清单4-4发出Cocoa条件信号
[cocoaCondition lock];
timeToDoWork++;
[cocoaCondition signal];
[cocoaCondition unlock];
假设使用Cocoa条件的线程在[cocoaCondition wait]
处阻塞。由于尚未调用[cocoaCondition unlock]
,因此它还拥有cocoaCondition
锁的所有权。
我的问题是 - 病情是如何发出信号的?一旦另一个线程试图获取cocoaCondition
锁定,它不会阻止吗?
答案 0 :(得分:4)
这是条件如何工作的一部分:wait
一个条件变量在等待操作的持续时间内原子地释放底层锁,并在条件变量发出信号后重新获取它。同样,signal
传递将不会发生,直到发出变量信号的线程释放变量的底层锁。