NSCondition如何运作?

sch*_*yxp 3 iphone multithreading locking unlock

我在这里使用NSCondition类:

- (void) method1
{
    [[cocoaCondition lock] lock];
    while (!someCheckIsTrue) {
        [cocoaCondition wait];
    }
    // Do something.
    [cocoaCondition unlock];
}

- (void) method2
{
    [cocoaCondition lock];
    // Do something.
    someCheckIsTrue = YES;
    [cocoaCondition signal];
    [cocoaCondition unlock];
}
Run Code Online (Sandbox Code Playgroud)

我有两个线程,thread1运行method1,thread2运行method2.我希望在[cocoaCondition wait]调用时,thread1将被阻止.然后当thread2调用时[cocoaCondition signal],thread1将恢复运行.我测试了代码,它正如我希望的那样工作.

但是,如您所见,当代码运行时:

第1步,thread1调用:( [cocoaCondition lock] Apple doc说:尝试获取锁,阻止线程的执行,直到获得锁定)

第2步,thread1调用:[cocoaCondition wait]
第3步,thread2调用:( [cocoaCondition lock]继苹果的doc之后,应该阻塞thread2)
第4步,thread2调用:( [cocoaCondition signal]因此,应该阻塞thread2,并且在调用之前不能调用此方法[cocoaConditon unlock])

我认为我的代码已陷入僵局,但为什么不呢?所以我猜想当thread1调用[cocoaCondition wait]第2步时,cocoaCondition被解锁了,是吗?

Mas*_*eta 6

NSCondition类参考

文档说:"当一个线程等待条件时,条件对象解锁其锁定并阻塞线程.当条件被发出信号时,系统唤醒线程.条件对象然后在从等待返回之前重新获取其锁定或waitUntilDate:method.因此,从线程的角度来看,就好像它始终保持锁定一样."

你的猜测是正确的.