0

構造体の配列があります。各構造体は以下のとおりです。

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]を渡すことだけを意図していました

4

1 に答える 1

1

配列への参照をすべてのスレッドに渡しているpoolため (OP にコードがないため、推測します)、各スレッドは配列の最初の要素を参照します。

次の行を変更することをお勧めします。

if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool)) 

することが:

if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool + i)) 

スレッド関数の現在のスレッド固有のエントリへの参照を渡します。pool

于 2013-02-26T07:07:36.623 に答える