【发布时间】:2011-04-14 09:16:33
【问题描述】:
我正在尝试设计一个可以由多个读/写线程同时访问的队列。我更喜欢使用 2 个互斥锁,一个用于读写。写很简单,锁定写互斥体,追加数据,解锁就完成了。
问题在于阅读。如果队列中没有数据,我希望我的线程等到数据可用。一种明显的方法是获取读取互斥锁并每隔 N 个时钟周期轮询队列,但这显然不是最好的方法。这让我想到了条件变量。有没有人有任何好的资源来讨论在 C++ 中使用条件变量(最好是基于 pthreads)实现阻塞队列?
具体来说,我看到以下问题:
- 一旦写入完成,写入线程将执行 pthread_cond_signal 表明数据存在,但它如何知道某个读取线程正在等待?除非存在 pthread_cond_wait,否则调用 pthread_cond_signal 是非法的。
- 可以调用 pthread_cond_broadcast 而不是 pthread_cond_signal 吗?也许这可能会绕过 pthread_cond_wait 的问题。此外,这似乎更合乎逻辑,因为多个阅读器线程绝对是一个真正的可能性。
- 读取器和写入器线程似乎也必须使用相同的互斥锁锁定才能使用条件变量。如果这是真的,那么我们就有一个严重的问题。
【问题讨论】:
-
为什么你认为#3 是“一个严重的问题?”
-
@pilcrow 问题很严重,因为我希望读/写线程能够并行访问队列。如果只有一个互斥体,则不会发生并行读/写。
-
正如 Jim Lewis 所指出的,不清楚您是否有任何 read 线程,只有两种 writer(消费者和生产者)。在这种情况下,
pthread_cond_wait将在等待期间自动释放其互斥体,以便生产者(以及到达的消费者,就此而言)不会阻塞互斥体......
标签: c++ multithreading pthreads