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

时间:2012-08-24 01:26:23

标签: ios multithreading blocking blockingqueue

如果我们需要实现队列(由NSMutableArray完成),并且我们有Producer个对象将数据添加到队列中。可以有1个生产者或多个生产者。如果队列已满(例如,大小为100),则应该“阻止”线程(等待,直到队列实际上小于100个项目)。 (从队列中删除数据也是如此:当它为空时,数据的获取也被阻止。)

如何实施这种“阻止”?现在我使用Mutex

@property (strong, atomic) NSLock *lock;

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

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

这是实施“阻止”行为的好方法吗?似乎有另一种方法可以获得canAddNowLock,这只是NSLock机制阻塞,当删除队列项时,然后释放此canAddNowLock,但是因为可以多个数据生成者和数据使用者,如果多个生成器被解除阻塞,或者如果多个消费者连续解锁canAddNowLock并且只有一个生产者被解除阻塞(实际上几个生产者应该被解除阻塞)怎么办?这样看起来似乎是一个更复杂的设计。

1 个答案:

答案 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];