我目前有一个生产者 - 消费者设置的两个线程,它使用pthread_cond_wait()
和pthread_cond_signal()
来交替读取数据和处理数据。如何将第二个消费者添加到基于pthread的生产者 - 消费者设置?
说我有一个锁,两个条件,并且指出如果数据缓冲器中有数据的布尔标志:
pthread_mutex_t lock;
pthread_cond_t we_have_data;
pthread_cond_t we_need_data;
bool buffer_is_empty = true;
我有一个使用以下函数来产生数据的pthread_t
(读数据成缓冲液):
static void* produce(void* arg) {
pthread_mutex_lock(&lock);
for (;;) {
while (!buffer_is_empty) {
pthread_cond_wait(&we_need_data, &lock);
}
pthread_mutex_unlock(&lock);
// read some data into our buffer
pthread_mutex_lock(&lock);
buffer_is_empty = false;
pthread_cond_signal(&we_have_data);
}
}
然后我有一个使用以下代码来消耗该数据,在接收到we_have_data
信号的第二pthread_t
:
static void* consume(void* arg) {
pthread_mutex_lock(&lock);
for (;;) {
while (buffer_is_empty) {
pthread_cond_wait(&we_have_data, &lock);
}
pthread_mutex_unlock(&lock);
// process the data in our buffer
pthread_mutex_lock(&lock);
buffer_is_empty = true;
pthread_cond_signal(&we_need_data);
}
}
这工作正常。
我现在想要做的是添加第三个线程,如果缓冲区中包含某些数据,它将对consume()
函数的数据起作用。
我曾尝试添加第三个条件,但我的程序挂起。
我设置了一个条件和布尔标志:
bool processing_with_second_consumer;
pthread_cond_t we_need_to_process_data_with_another_consumer;
然后我修改消费者:
static void* consume(void* arg) {
pthread_mutex_lock(&lock);
for (;;) {
while (buffer_is_empty && !processing_with_second_consumer) {
pthread_cond_wait(&we_have_data, &lock);
}
pthread_mutex_unlock(&lock);
// process the data in our buffer
pthread_mutex_lock(&lock);
if (data_meets_our_conditions) {
processing_with_second_consumer = true;
pthread_cond_signal(&we_need_to_process_data_with_another_consumer);
}
buffer_is_empty = true;
pthread_cond_signal(&we_need_data);
}
}
然后我修改了生产者等待布尔:
static void* produce(void* arg) {
pthread_mutex_lock(&lock);
for (;;) {
while (!buffer_is_empty && !processing_with_second_consumer) {
pthread_cond_wait(&we_need_data, &lock);
}
pthread_mutex_unlock(&lock);
// read some data into our buffer
pthread_mutex_lock(&lock);
buffer_is_empty = false;
pthread_cond_signal(&we_have_data);
}
}
并添加第三个线程从消费者消费:
static void* consume_from_the_consumer(void* arg) {
pthread_mutex_lock(&lock);
for (;;) {
while (!buffer_is_empty && processing_with_second_consumer) {
pthread_cond_wait(&we_need_to_process_data_with_another_consumer, &lock);
}
pthread_mutex_unlock(&lock);
// do more specific processing of the data in our buffer
pthread_mutex_lock(&lock);
processing_with_second_consumer = false;
}
}
我似乎无法让程序正确退出 - 它基本上挂在消费者消费的无限循环中。
为了允许第三个(或第四个或第五个等)线程,如何正确设置pthread条件的信号?
我无法得到这个工作,似乎。通过三个线程和一个“开/关”条件,两个线程在给定时间将被解除阻塞。你有这样的例子吗? –
@AlexReynolds两个线程将被解锁,但“错误”的线程会立即再次阻止。这就是'while'循环的意义所在。当你尝试时出了什么问题? –
我的程序挂在处理数据上。 –