2010-12-08 34 views
2

我正在为iPhone编写并发应用程序。 我不知道如果这个代码:在循环中阻塞相当于空的互斥锁?

while(!conditionBoolean) 
{ 
    // do nothing 
    // until another thread makes this variable true. 
} 

makeWork(); 

等同于以下内容:

[lock lock];  // this lock is locked by another thread 
        // causing the current to block until it's unlocked 

[lock unlock]; 
makeWork(); 

如果不是,有什么区别?

谢谢。

回答

6

你应该更喜欢第二个,第一个会产生一个紧密的循环和延迟,或者甚至可能阻止变量以你想要的方式设置。至少你必须在这个循环中引入延迟,这是一种睡眠。

更好的办法是等待信号原语完成工作,然后由其他线程发送信号 - 设计是确定性的,与取决于某个其他线程可能锁定的互斥锁或状态变量在获得机会之前进行修改。一般来说,多线程设计最好是事件驱动(push模型),而不是机会性地检查共享状态(拉模型)。

+0

谢谢史蒂夫!你能给出一个信令原语的例子吗? – wh1t3cat1k 2010-12-08 16:46:05

+0

例如。 `NSConditionLock` - 请参阅http://objc.toodarkpark.net/Foundation/Classes/NSConditionLock.html – 2010-12-08 16:50:03

1

我对互斥锁的理解是锁可以在较少的周期内发生,例如,当您读取conditionboolean成为true时,有可能另一个线程在读取它时仍然可以将其更改为true ,而另一个在再次阅读之前会变成错误的。这变成了竞争状态,互斥锁将希望避免。如果你有许多具有类似while循环的函数,这也可能导致你的代码不成为“下一个行”。