【发布时间】:2012-08-19 14:08:16
【问题描述】:
如果我们需要实现一个队列(由NSMutableArray 完成),并且我们有Producer 将数据添加到队列的对象。可以有 1 个生产者或多个生产者。如果队列已满(例如,大小为 100),则线程应该被“阻塞”(等待,直到队列实际上小于 100 个项目)。 (从队列中取出数据也是如此:当队列为空时,数据的获取也被阻塞)。
如何实现这种“阻塞”?现在我使用互斥锁
@property (strong, atomic) NSLock *lock;
这样就可以得到NSMutableArray的count和item的加法(因为count可以是99,但是加item的时候count可能已经不一样了)。
但是对于阻塞效果,我其实是去查count的,如果是100,就释放锁,休眠0.1秒,然后再次获取锁,获取count,如上重复。
这是实现“阻塞”行为的好方法吗?似乎还有另一种方法可以得到canAddNowLock,就是简单的被NSLock机制阻塞,当一个队列项被移除后,再释放这个canAddNowLock,但是由于可以有多个数据生产者和数据消费者,如果多个生产者被解锁,或者如果多个消费者连续解锁canAddNowLock并且只有一个生产者被解锁(实际上应该解锁多个生产者)怎么办?这样一来,设计看起来就更复杂了。
【问题讨论】:
标签: ios multithreading blocking blockingqueue