2

ミューテックスを使用して、コードの特定の部分へのアクセスを 1 つのスレッドに制限しようとしていますが、一度ロックして他の部分をブロックする代わりに、すべてのスレッドを「ロック」できるようです。以下は私のコードで、コードが機能していないことを示す出力のセクションです。

//headers defined, etc

pthread_mutex_t queuemutex = PTHREAD_MUTEX_INITIALIZER;

// other code with various functions

int main(void) {

    //unrelated code

    threadinformation **threadArray = (threadinformation **)malloc( POOLSIZE * sizeof(threadinformation) );

    int k;
    for (k = 0; k < POOLSIZE; k++) {
        pthread_t thread;
        threadinformation *currentThread = (threadinformation *)malloc(sizeof(threadinformation));
        currentThread->state = (int *)malloc(sizeof(int));
        currentThread->state[0] = 0;
        currentThread->currentWaiting = currentWaiting;
        currentThread->number = k;
        threadArray[k] = currentThread;
        pthread_create(&thread, NULL, readWriteToClient, threadArray[k]); //thread is created here
        currentThread->thread = thread;
        joinArray[k] = thread;
    }

    //unrelated code

}

static void* readWriteToClient(void *inputcontent) {

    while(1){

        //unrelated code

        pthread_mutex_lock(&queuemutex); //problem happens here

        fprintf(stderr,"Thread %d got locked \n",threadInput->number);

        while((threadInput->currentWaiting->status) == 0){
            pthread_cond_wait(&cond, &queuemutex);
            fprintf(stderr,"Thread %d got signalled \n",threadInput->number);
        }

        connfd = threadInput->currentWaiting->fd;
        threadInput->currentWaiting->status = 0;
        pthread_cond_signal(&conncond);
        pthread_mutex_unlock(&queuemutex);

        //unrelated code

    }

}

出力。

Thread 0 got locked 
Thread 7 got locked 
Thread 25 got locked 
Thread 97 got locked 
Thread 6 got locked 
Thread 5 got locked 
Thread 4 got locked 
Thread 3 got locked 
Thread 8 got locked 
Thread 9 got locked 
Thread 10 got locked 
Thread 11 got locked 
Thread 12 got locked 
Thread 13 got locked 
Thread 14 got locked 
Thread 15 got locked 
Thread 16 got locked 
Thread 17 got locked 
Thread 18 got locked 
Thread 19 got locked 
Thread 20 got locked 
    And so on...
4

2 に答える 2

3

問題はない。

pthread_cond_wait(&cond, &queuemutex);

条件変数を待機すると、ミューテックスが解放されます。

于 2013-02-26T21:58:54.383 に答える
1

fceller が言ったことのより長いバージョンは、 pthread_cond_wait(&cond, &mutex) が戻る前に 3 つのことを行うということです。 .

あなたの例は、最初のシグナルを送信するもの(もしあれば)を示しておらず、ワーカースレッドが待機しているステータスを設定するもの(もしあれば)を示していません。

pthread_cond_wait() と pthread_cond_signal() のより典型的な使用例を次に示します。

void producer() {
    pthread_mutex_lock(&mutex);
    push_something_on_the_queue();
    ptherad_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);
}

void consumer() {
    pthread_mutex_lock(&mutex);
    while (! time_to_quit) {
        if (queue_is_empty) {
            pthread_cond_wait(&cond, &mutex);
        } else {
            thing = take_something_from_the_queue();

            pthread_mutex_unlock(&mutex);
            do_something_with(thing);
            pthread_mutex_lock(&mutex);
        }
    }
    pthread_mutex_unlock(&mutex);
}

プロデューサー スレッドは、物事をキューに入れます。コンシューマー スレッドは、キューに何かが表示されるのを待ってから、それらを取り出して何かを行います。コンシューマーはループで待機し、ウェイクアップするたびにキューのステータスをチェックします (キューに何もない場合でも、スレッドは「誤って」通知される場合があります)。

ミューテックスは、コンシューマーがキューをチェックしているときにロックされ、コンシューマーがスリープするかキューから何かをポップするまでロックされたままになります。コンシューマーがスリープしている間はミューテックスはロックされません。

任意の数のコンシューマーを同時に consumer() メソッドに含めることができます。彼らは別のものを操作しているかもしれませんし、眠っているかもしれません。ただし、ミューテックスは、常に複数のスレッド (プロデューサーまたはコンシューマー) がキューにアクセスできないことを保証します。

于 2013-12-12T21:12:00.227 に答える