如何在消费者线程中组织等待来自主线程的数据

Posted

技术标签:

【中文标题】如何在消费者线程中组织等待来自主线程的数据【英文标题】:how to organize waiting for data from main thread in consumer thread 【发布时间】:2011-08-22 15:05:33 【问题描述】:

主线程从套接字读取数据并将其存储在队列中。第二个线程将此数据写入磁盘文件。但是如果第二次写入比第一次读取数据快,那么如何组织等待。

我想用信号量来做,但是我怎样才能增加信号量计数器然后下一个数据块读入队列。我知道如何在第二个线程中减少它。

【问题讨论】:

您使用的是哪个线程库? Pthreads、C++0x、WinThreads、Boost 等? 对不起...释放增加和 WaitFor 减少信号量计数。 【参考方案1】:

听起来像是一个“经典”的生产者-消费者队列。您需要一个线程安全队列和一个初始化为 0 的信号量来计算其中的对象。如果您没有线程安全队列,则另一个初始化为 1 的信号量(或互斥体)将保护队列免受多次访问。

本质上,在生产者中,malloc 一个缓冲区结构,从套接字读取数据到其中,将其地址推入线程安全队列,向信号量发出信号。在消费者中,等待信号量,从队列中弹出一个缓冲区地址,将数据写入磁盘文件,释放缓冲区。

您可以使用 C++ 替换缓冲区类和 new/dispose 来代替缓冲区结构和 malloc/free。然后套接字/磁盘操作可以是缓冲区类的方法。

Rgds, 马丁

【讨论】:

谢谢,我使用 std::priority_queue,它对于读写操作不是线程安全的,所以我也使用互斥锁。我需要在替换的 new/dispose 中实现什么算法?

以上是关于如何在消费者线程中组织等待来自主线程的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何实现java主线程等待子线程执行完毕之后再执行

c# 怎么等待线程池中所有线程都运行结束在运行主线程

面试官:如何让主线程等待所有的子线程结束之后再执行?我懵了

windows API主线程如何等待子线程结束后再继续运行

MFC主线程等待另一个线程结束

从睡眠中唤醒主线程