我目前有一個生產者 - 消費者設置的兩個線程,它使用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'循環的意義所在。當你嘗試時出了什麼問題? –
我的程序掛在處理數據上。 –