如果我们需要实现队列(由NSMutableArray
完成),并且我们有Producer
个对象将数据添加到队列中。可以有1个生产者或多个生产者。如果队列已满(例如,大小为100),则应该“阻止”线程(等待,直到队列实际上小于100个项目)。 (从队列中删除数据也是如此:当它为空时,数据的获取也被阻止。)
如何实施这种“阻止”?现在我使用Mutex
@property (strong, atomic) NSLock *lock;
以便获得NSMutableArray的计数并且一起完成项目的添加(因为计数可以是99,但是当添加项目时,计数可能已经不同了。)
但是对于阻挡效果,我实际检查计数,如果是100,释放锁定并休眠0.1秒,然后再次获得锁定并获得计数,并重复上述步骤。
这是实施“阻止”行为的好方法吗?似乎有另一种方法可以获得canAddNowLock
,这只是NSLock
机制阻塞,当删除队列项时,然后释放此canAddNowLock
,但是因为可以多个数据生成者和数据使用者,如果多个生成器被解除阻塞,或者如果多个消费者连续解锁canAddNowLock
并且只有一个生产者被解除阻塞(实际上几个生产者应该被解除阻塞)怎么办?这样看起来似乎是一个更复杂的设计。
答案 0 :(得分:1)
使用NSCondition *条件 线程1:
[condition lock];
//check the queue is not full
[condition wait];//if already full, wait
//check again
//put something into queue
[condition unlock];
线程2:
[condition lock];
//check the queue is not empty
//get something from queue
[condition signal];
[condition unlock];