pthread条件変数を使用してスレッド同期に問題が発生しています。私はいくつかの値を抽出するメッセージと抽出された値を使用していくつかの変数をインクリメントする別のスレッドを解析する1つのスレッドを持っています。 これらの2つのスレッドを同期するためにpthread条件変数を使用しました。 最初のスレッドは、以下のスニペットのようになります。pthread条件変数とのスレッド同期
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);
}
ワーカースレッドは以下のスニペットのようになります。
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
このコードは正しくほとんどの時間を動作します。 スリープ中のスレッドがいくつかの目覚めをスキップするという、多くのメッセージを順番に受け取ると、時々起こります。作業スレッドが作業を完了するまで、受信スレッドをブロックするためにセマフォーが必要な場合がありますか?どうやって? ありがとうございます。
A)のprintfとCOUTはスレッドセーフではありません、ので、それらの出力は待ちの実際の順序を反映し、コードに目覚めていない可能性があります
q_changed *揮発性にすることをお勧めします:
をそして、あなたの第二、これにワーカースレッドを変更します。 – JimmyB