Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 这个条件是如何工作的?_Iphone_Multithreading_Locking_Unlock - Fatal编程技术网

Iphone 这个条件是如何工作的?

Iphone 这个条件是如何工作的?,iphone,multithreading,locking,unlock,Iphone,Multithreading,Locking,Unlock,我在这个意义上使用了NSCondition类: - (void) method1 { [[cocoaCondition lock] lock]; while (!someCheckIsTrue) { [cocoaCondition wait]; } // Do something. [cocoaCondition unlock]; } - (void) method2 { [cocoaCondition lock]; //

我在这个意义上使用了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];
}
我有两个线程,thread1运行method1,thread2运行method2。我希望在调用
[cocoaCondition wait]
时,thread1将被阻塞。然后,当thread2调用
[cocoaCondition信号]
时,thread1将恢复运行。我已经测试了代码,它就像我希望的那样工作

但是,正如您所看到的,当代码运行时:

步骤1,thread1调用:
[cocoaCondition lock]
(苹果文档中说:尝试获取锁,阻止线程执行,直到可以获取锁为止)

步骤2,thread1调用:
[cocoaCondition wait]

步骤3,thread2调用:
[cocoaCondition lock]
(根据苹果的文档,thread2应该被阻止)
步骤4,thread2调用:
[cocoaCondition signal]
(因此,thread2应该被阻止,并且在调用
[cocoaCondition unlock]
之前不能调用此方法)

我想我的代码已经死锁了,但为什么不呢? 因此,我猜当thread1在步骤2中调用
[cocoacdition wait]
时,cocoacdition是解锁的,是吗?

文件说:当线程等待某个条件时,条件对象将解锁其锁并阻止线程。当条件发出信号时,系统唤醒线程。然后,condition对象在从wait或waitUntilDate:方法返回之前重新获取其锁。因此,从线程的角度来看,它似乎总是持有锁。”


你的猜测是对的。

为什么你需要while循环?难道你不能直接调用wait,然后一旦信号被调用wait就会退出吗?@jjxtra来自苹果的NSCondition文档:“布尔谓词是使用条件语义的重要部分,因为信号的工作方式。发出条件信号并不保证条件本身为真。信号中存在可能导致出现虚假信号的定时问题。”