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

在iOS上,如何实现阻塞或;“被封锁”;在产生数据的线程上?,ios,multithreading,blocking,blockingqueue,Ios,Multithreading,Blocking,Blockingqueue,如果我们需要实现一个队列(由NSMutableArray完成),并且我们有Producer对象将数据添加到队列中。可以有一个生产商或多个生产商。如果队列已满(例如,大小为100),线程应该被“阻塞”(等待,直到队列实际小于100个项目)。(从队列中取出数据也是如此:当队列为空时,数据的获取也会被阻止) 如何实现这种“阻塞”?现在我使用互斥锁 @property (strong, atomic) NSLock *lock; 这样就可以获得NSMutableArray的计数,同时添加项(因为计数可

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

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

@property (strong, atomic) NSLock *lock;
这样就可以获得NSMutableArray的计数,同时添加项(因为计数可以是99,但添加项时,计数可能已经不同)

但是对于阻塞效果,我实际上检查了计数,如果是100,释放锁并休眠0.1秒,然后再次获取锁并获取计数,并重复上述操作

这是实现“阻塞”行为的好方法吗?似乎还有另一种方法可以获得
canadnowlock
,它只是通过
NSLock
机制进行阻塞,当队列项被移除时,然后释放此
canadnowlock
,但是由于可能存在多个数据生产者和数据消费者,如果多个生产者被解除阻塞会怎么样,或者,如果多个使用者连续解锁
canAddNowLock
,并且只有一个生产者被解锁(而实际上应该解锁多个生产者),该怎么办?这样的设计似乎更复杂。

使用NSCondition*条件 线程1:

线程2:

[condition lock];
//check the queue is not empty
//get something from queue
[condition signal];
[condition unlock];
使用NSCondition*条件 线程1:

线程2:

[condition lock];
//check the queue is not empty
//get something from queue
[condition signal];
[condition unlock];

对于thread1,那么
[条件等待]
[再次检查]
需要处于循环中吗?(但是由于
信号
唤醒了1个线程(即使多个线程正在等待,所以可能这已经可以完成任务了…甚至不需要在
//再次检查
时进行第二次检查?)对于多个线程,您可以使用[condition broadcast]第二个检查是为了安全,对于多线程处理,你再小心也不为过。因此,如果要小心,“检查并等待”不需要在循环中吗?(但是,即使第二次检查,如果有错误,那么即使在第二次检查和添加数据之间,也可能已经有一些不良影响已经在其他地方发生了。。。(顺便说一下,我检查了7本顶级iOS书籍,包括2本烹饪书,其中没有一本在索引部分有
NSCondition
,但有2本苹果iOS官方指南涵盖了这一点)如果您总是使用此条件来保护您的队列,则您在[condition wait]和[condition unlock]之间持有锁所以其他线程无法操作队列,这已经足够安全了。您应该进行双重检查的另一个原因是当您[条件等待]时,您实际上释放了锁,因此在再次获取之前任何事情都可能发生。是否使用循环取决于您的应用程序的逻辑,我给您的代码片段只是为了激励您。我的意思是,如果第二次检查实际返回队列已满,则不会出现
[条件等待]
需要再次执行,然后是第三次检查,依此类推……可能还有第四次检查和另一次等待,所以这不意味着它需要在循环中吗?对于thread1,因此
[条件等待]
[再次检查]
需要在循环中?(但是既然
信号
唤醒了一个线程(即使当多个线程正在等待时,也可能已经完成了任务…甚至不需要在
//再次检查
处进行第二次检查。)对于多线程,您可以使用[condition broadcast]唤醒所有线程。第二次检查是为了安全,对于多线程,您不能太小心。因此,如果要小心,不是吗“检查并等待”需要在一个循环中吗?(但即使第二次检查,如果有错误,那么即使在第二次检查和添加数据之间,也可能已经有一些不良影响已经在其他地方发生了。。。(顺便说一下,我检查了7本顶级iOS书籍,包括2本烹饪书,其中没有一本在索引部分有
NSCondition
,但有2本苹果iOS官方指南涵盖了这一点)如果您总是使用此条件来保护您的队列,则您在[condition wait]和[condition unlock]之间持有锁所以其他线程无法操作队列,这已经足够安全了。您应该进行双重检查的另一个原因是当您[条件等待]时,您实际上释放了锁,因此在再次获取之前任何事情都可能发生。是否使用循环取决于您的应用程序的逻辑,我给您的代码片段只是为了激励您。我的意思是,如果第二次检查实际返回队列已满,则不会出现
[条件等待]
需要再次进行检查,然后进行第三次检查,依此类推……可能还要进行第四次检查,然后再等待一次,这难道不意味着需要进行循环吗?