繁体   English   中英

在生产者继续之前等待所有异步使用者完成

[英]Waiting for all asynchronous consumers to complete before producer continues

我们有一个非常接近生产者-消费者问题的问题集。 实际用例是针对一个线程(生产者)的,该线程贯穿目录列表(大约2000个条目),然后将这些条目提供给处理这些目录中特定文件的4个线程(消费者)。

我们试图解决的问题是如何使生产者线程在继续使用之前等待最终使用者完成。 一旦我们将所有文件都保存在内存中,就需要进行后处理,只有在读取完所有文件后才能进行。

我们基于轮询类计数器的繁忙等待,实现了一个非常幼稚的计数器解决方案(轮询由生产者增加,消费者减少,由互斥锁保护):

   while(fileCnt > 0) {
     usleep(10000);
  }

这是一个不好的解决方案。

有什么办法可以通过条件/信号量/其他方式做到这一点吗?

我们仅限于非C ++ 11实现(基于pthread)。

谢谢。

嗯..在一般情况下,实际上很难以有效的方式进行。 如果您在提交第一个条目之前就知道要提交多少个对象到队列中(就像您所做的那样),那么会更容易:

将原子整数设置为要提交的对象数。 在线程完成对每个对象的处理之后,在排队的每个队列中加载一个回调。 回调将int减为零。 当线程将其递减为零时,它向同步对象发出信号,生产者在排队其最后一个对象之后正在等待该对象。

我仍然在考虑如果生产者正在迭代某个列表并且在排队其第一项之前不知道结尾在哪里该怎么办:(

这种情况可能需要在回调中实际锁定,以便生产者可以输入它并“原子地”检查所有排队的操作是否已完成,如果尚未完成,请在退出锁定后等待同步对象。 如果同步对象保持状态,则更加安全。 一个信号量,这样就不会错过退出锁之后但在等待之前发出的信号((不确定如何使用condvar安全地执行该信号)。)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM