首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCondition,如果呼叫信号没有锁定怎么办?

NSCondition,如果呼叫信号没有锁定怎么办?
EN

Stack Overflow用户
提问于 2015-01-16 01:51:12
回答 1查看 1.1K关注 0票数 3

NSCondition中,NSCondition的用法应该是:

头1:

代码语言:javascript
复制
[cocoaCondition lock];
while (timeToDoWork <= 0)
    [cocoaCondition wait];
timeToDoWork--;
// Do real work here.
[cocoaCondition unlock];

线程2:

代码语言:javascript
复制
[cocoaCondition lock];
timeToDoWork++;
[cocoaCondition signal];
[cocoaCondition unlock];

NSConditon

使用此方法唤醒正在等待条件的一个线程。您可以多次调用此方法来唤醒多个线程。如果没有线程在此条件下等待,则此方法不执行任何操作。为了避免争用条件,只应在接收方被锁定时才调用此方法。

我的问题是:

我不希望线程2在任何情况下都被阻塞,所以我删除了线程2中的lockunlock调用。也就是说,线程2可以按自己的意愿进行任意多的工作,线程1将一个接一个地完成工作,如果不再工作,则等待(阻塞)。这也是一个生产者-消费者模式,但生产者从来没有被封锁.

但是,根据苹果公司的文件,这种方式是不正确的,那么这种模式有什么可能出错呢?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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() ),不使用锁。但是,如果共享数据比共享数据更复杂(可能在任何非平凡的情况下都是如此),那么它们确实需要使用同步机制,比如条件锁。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27976126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档