我们有一个非常接近生产者 - 消费者问题的问题集。实际使用情况是针对通过目录列表(生产者)运行的线程(大约2000条),然后将这些条目提供给处理这些目录中特定文件的4个线程(消费者)。在生产者继续之前等待所有异步消费者完成
我们试图解决的问题是如何让生产者线程在继续之前等待最终消费者完成。一旦我们将所有文件存储在内存中,只有在读取完所有文件后才能完成后期处理。
我们已经实现了一个基于忙等待很天真计数器的解决方案,投票类计数器(计数器由生产增加,由消费者递减,由一个互斥保护):
while(fileCnt > 0) {
usleep(10000);
}
这是事业的不一个很好的解决方案。
有没有通过条件/信号量/其他方法做到这一点?
我们仅限于非C++ 11实现(基于pthread)。
谢谢。
这些消费者正在通过cv + mtx受保护,谁的内容大小是其中的一部分谓词检查,是吗? – WhozCraig 2014-10-02 08:10:27
典型的方法是有一个信号量,并预先加载队列大小的信号量(例如4,5或8,以允许生产者为消费者准备一些项目)。然后在信号量的上下用来指示剩余的空间量,当信号量为零时,它等待对方消耗下一个项目) – 2014-10-02 08:11:14
@WhozCraig“我们仅限于非C++ 11实现(基于pthread)“。 ---除非你提出推荐变体。 – Jagannath 2014-10-02 08:17:15