構造体の配列があります。各構造体は以下のとおりです。
struct thread_st
{
pthread_t thr;
int conn;
pthread_mutex_t mutex;
pthread_cond_t cond;
};
connは、スレッドに実行する作業があるかどうかを示します。> = 0の場合はタスクを示し、-1の場合は待機します。-1を読み取ると、次のループを使用してブロードキャストを待機してから続行します。エラー処理を少し削除したため、elseなどでブロックを必要なものに縮小します。
while (str->conn == -1) {
else {
if (pthread_cond_wait(&str->cond,&str->mutex)) {
if (pthread_mutex_unlock(&str->mutex)) { }
return NULL;
}
printf("here b3\n");
}
}
さて、私の問題は、cond変数がブロードキャストpthread_cond_broadcast(&thr-> cond)の場合、thrがthread_st型である場合、すべてのスレッドが「hereb3」ステートメントを出力することです。正気のために、thread_st配列を使用してテストしました(ここでもエラー処理は削除されています)
struct thread_st pool[TP_SIZE];
for (i = 0; i < TP_SIZE; i++) {
pool[i].conn = -1;
if (pthread_mutex_init(&pool[i].mutex,NULL)) { }
if (pthread_cond_init(&pool[i].cond,NULL)) { }
if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool)) { }
}
何か案は?これは、cond変数とmutex変数を使用した最初の実際の試みなので、愚かである場合は教えてください。
ありがとう
更新 スレッドは、配列の最初の構造体にある条件変数のブロードキャストにのみ応答します。
アップデート2 が見つかりました。それは私がばかだった。pthread createと呼んだところ、プール全体を渡しました。私はpool[i]を渡すことだけを意図していました