0

答えやすいかもしれない一般的な質問がありますが、そうではないかもしれません。わからない。私のコードでは、4 つのスレッドが実行されており、すべてがリストを処理するように機能しており、実行するたびにそれぞれがリストの一部をポップしています。以下は、各スレッドのコードで、ミューテックスのロックが解除されるのを待ち、それ自体をロックし、それぞれの処理を実行してから、ミューテックスを再ロックします。

私の質問はこれです:特定のスレッドにロックを渡す方法はありますか? \

例: このコード (t1、t2、t3、および t4) を実行する 4 つのスレッドがあり、t1 がちょうど終了した場合、t1 がロックを t2 に渡し、t2 がロックをに渡すことを保証できる方法はありますか? t3など?

void *consumer(void *ptr){
    int i;

    // Print the thread ID
    printf("Consumer TID %lu\n", (unsigned long)gettid());

    // While the list isn't empty
    while (1){
    // Wait for the mutex
    pthread_mutex_lock(&mutex);
        // When you get it...

        // If the list is empty
        if (the_list.empty()){
            // Unlock the mutex
            pthread_mutex_unlock(&mutex);
            break;
        }

        // Otherwise remove an element from the list
        the_list.pop_front();

        // And unlock the mutex
        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

ありがとうございました!

更新 - ランダム な考え: 考えただけです。前の関数によってのみ解放された特定のミューテックスをそれぞれ取り込んだ 4 つの異なる関数があるでしょうか?

4

1 に答える 1

3

消費者の問題は、リストが空になっても準備ができている必要があることです。

私がこれを言うのは、最初の生産者が来る前に消費者が準備が整っている場合があるからです。その状況では、消費者は空のリストを見て終了するため、生成された要素は消費されません。

だから私はむしろ提案します

pthread_mutex_lock(&mutex);
while(the_list.empty())
  pthread_cond_wait(&produced, &mutex);
pthread_mutex_unlock(&mutex);

そしてプロデューサーはあなたに signal を知らせますpthread_cond_signal(&produced)

これはあなたの質問への答えにもなると思います:あなたは「ロックを渡す」のではなく、信号を送ります(そして信号を待ちます-「ロックを渡す」ことに興味があるなら、3-でそれを行うことができます4 つの異なる信号)。


ロックに関しては、ロックはスレッドごとではなくデータごとです。したがって、ロックは通常、データと一緒に保存されます。

struct threadsafe_data_t {
  data_t data;
  pthread_mutex_t mutex;
  pthread_cond_t modified; // or produced or whatever 
};
于 2012-12-06T00:21:10.327 に答える