如果我们需要实现一个队列(由NSMutableArray完成),并且我们有向队列添加数据的Producer对象。可以有一个生产者或多个生产者。如果队列已满(例如,大小为100 ),则线程应该被“阻塞”(等待,直到队列实际小于100个项)。(同样的道理也适用于从队列中取出数据:当队列为空时,获取数据也会被阻塞)。
如何实现这种“阻塞”?现在我使用的是互斥锁
@property (strong, atomic) NSLock *lock;从而获得NSMutableArray的计数并一起完成项目的添加(因为该计数可以是99,但是当添加该项目时,该计数可能已经不同)。
但对于阻塞效果,我实际上检查了计数,如果是100,释放锁并休眠0.1秒,然后再次获得锁并获得计数,重复上面的步骤。
这是实现“阻塞”行为的好方法吗?似乎还有另一种方法来获取canAddNowLock,它简单地由NSLock机制阻塞,当一个队列项被删除时,然后释放这个canAddNowLock,但是由于可以有多个数据生产者和数据消费者,如果多个生产者被解锁,或者如果多个消费者解锁canAddNowLock,并且只有一个生产者被解锁(实际上应该解锁几个生产者),该怎么办?这似乎是一种更复杂的设计。
发布于 2012-08-24 09:36:51
使用NSCondition *condition thread1:
[condition lock];
//check the queue is not full
[condition wait];//if already full, wait
//check again
//put something into queue
[condition unlock];thread2:
[condition lock];
//check the queue is not empty
//get something from queue
[condition signal];
[condition unlock];https://stackoverflow.com/questions/12102135
复制相似问题