首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在iOS上,如何在产生数据的线程上实现阻塞或“被阻塞”?

在iOS上,如何在产生数据的线程上实现阻塞或“被阻塞”?
EN

Stack Overflow用户
提问于 2012-08-24 09:26:23
回答 1查看 159关注 0票数 1

如果我们需要实现一个队列(由NSMutableArray完成),并且我们有向队列添加数据的Producer对象。可以有一个生产者或多个生产者。如果队列已满(例如,大小为100 ),则线程应该被“阻塞”(等待,直到队列实际小于100个项)。(同样的道理也适用于从队列中取出数据:当队列为空时,获取数据也会被阻塞)。

如何实现这种“阻塞”?现在我使用的是互斥锁

代码语言:javascript
复制
@property (strong, atomic) NSLock *lock;

从而获得NSMutableArray的计数并一起完成项目的添加(因为该计数可以是99,但是当添加该项目时,该计数可能已经不同)。

但对于阻塞效果,我实际上检查了计数,如果是100,释放锁并休眠0.1秒,然后再次获得锁并获得计数,重复上面的步骤。

这是实现“阻塞”行为的好方法吗?似乎还有另一种方法来获取canAddNowLock,它简单地由NSLock机制阻塞,当一个队列项被删除时,然后释放这个canAddNowLock,但是由于可以有多个数据生产者和数据消费者,如果多个生产者被解锁,或者如果多个消费者解锁canAddNowLock,并且只有一个生产者被解锁(实际上应该解锁几个生产者),该怎么办?这似乎是一种更复杂的设计。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-24 09:36:51

使用NSCondition *condition thread1:

代码语言:javascript
复制
[condition lock];
//check the queue is not full
[condition wait];//if already full, wait
//check again
//put something into queue
[condition unlock];

thread2:

代码语言:javascript
复制
[condition lock];
//check the queue is not empty
//get something from queue
[condition signal];
[condition unlock];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12102135

复制
相关文章

相似问题

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