在NSCondition中,NSCondition的用法应该是:
头1:
[cocoaCondition lock];
while (timeToDoWork <= 0)
[cocoaCondition wait];
timeToDoWork--;
// Do real work here.
[cocoaCondition unlock];线程2:
[cocoaCondition lock];
timeToDoWork++;
[cocoaCondition signal];
[cocoaCondition unlock];使用此方法唤醒正在等待条件的一个线程。您可以多次调用此方法来唤醒多个线程。如果没有线程在此条件下等待,则此方法不执行任何操作。为了避免争用条件,只应在接收方被锁定时才调用此方法。
我的问题是:
我不希望线程2在任何情况下都被阻塞,所以我删除了线程2中的lock和unlock调用。也就是说,线程2可以按自己的意愿进行任意多的工作,线程1将一个接一个地完成工作,如果不再工作,则等待(阻塞)。这也是一个生产者-消费者模式,但生产者从来没有被封锁.
但是,根据苹果公司的文件,这种方式是不正确的,那么这种模式有什么可能出错呢?谢谢。
发布于 2015-01-16 05:17:12
当多个线程正在访问共享数据时,无法锁定是一个严重的问题。在苹果代码的例子中,如果Thread 2没有锁定条件对象,那么它可以在Thread 1减少它的同时增加timeToDoWork。这可能导致其中一个操作失败的结果。例如:
线程1读取timeToDoWork的当前值,获取1
线程2读取timeToDoWork的当前值,获取1
线程2计算增量值(timeToDoWork + 1),获取2
线程1计算递减值(timeToDoWork - 1),获取0。
线程2写入timeToDoWork的新值,存储2
线程1写入timeToDoWork的新值,存储0
timeToDoWork从1开始,是递增和递减的,所以它应该以1结尾,但实际上以0结尾。通过重新安排这些步骤,最终可能会达到2。想必,timeToDoWork的价值代表了一些真实而重要的东西。搞错可能会搞砸这个项目。
如果您的两个线程正在做一些简单的事情,比如递增和递减一个数字,那么它们可以使用原子操作函数(如OSAtomicIncrement32Barrier()和OSAtomicDecrement32Barrier() ),不使用锁。但是,如果共享数据比共享数据更复杂(可能在任何非平凡的情况下都是如此),那么它们确实需要使用同步机制,比如条件锁。
https://stackoverflow.com/questions/27976126
复制相似问题