【发布时间】:2016-07-21 18:21:35
【问题描述】:
我在使用 pthread 条件变量进行线程同步时遇到了一些问题。我有一个线程解析提取一些值的消息,另一个线程使用提取的值增加一些变量。 我使用 pthread 条件变量来同步这两个线程。 第一个线程看起来像下面的 sn-p:
if(parse_ok){
pthread_mutex_lock(&q_mutex);
q = extract_value();
q_changed = true;
printf("...awake\n");
pthread_cond_signal(&q_cond_var);
pthread_mutex_unlock(&q_mutex);
}
工作线程看起来像下面的sn-p:
while(true){
pthread_mutex_lock(&q_mutex);
if( !q_changed ){
std::cout<<"waiting..!"<<std::endl;
pthread_cond_wait(&q_cond_var, &q_mutex);
}
if(q_changed){
q_changed = false;
_actual_q += q;
_total_q += q;
_quant_q += q/_fixed_quantity;
}
pthread_mutex_unlock(&q_mutex);
}//END of while TRUE
此代码大部分时间都能正常工作。 有时会发生,当我一个接一个地收到很多消息时,睡眠线程会跳过一些唤醒。在工作线程完成工作之前,我是否需要一些信号量来阻止接收线程?如何? 提前致谢。
【问题讨论】:
-
可能想让 q_changed volatile。
标签: c++ c multithreading