3

私の知る限り、ミューテックスは一度ロックしてから、解放されるまで他のブロックをブロックする必要があります。

ここに画像の説明を入力

しかし、私のコードでは、複数のスレッドが同じミューテックスをロックしているようです。私は 10 のスレッド プールを持っているので、確実に 9 がブロックされ、1 がロックされるはずです。しかし、私はこの出力を得ます。

Thread 0 got locked 
Thread 1 got locked 
Thread 3 got locked 
Thread 4 got locked 
Thread 2 got locked 
Thread 5 got locked 
Thread 6 got locked 
Thread 7 got locked 
Thread 8 got locked 
Thread 9 got locked 

私のミューテックスは、 *.c ファイルの先頭でグローバルに次のように定義されています。

pthread_mutex_t queuemutex = PTHREAD_MUTEX_INITIALIZER;

そして、ここに関連するコード セグメントがあります。

    //In the main function which creates all the threads
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]);
    currentThread->thread = thread;
    joinArray[k] = thread;
}

そして、これは 10 個のスレッドすべてがロックを取得しているように見えるコードのセグメントです。

pthread_mutex_lock(&queuemutex);

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);
4

1 に答える 1

7

currentWaiting->status私の超能力はそれが最初はであることを示唆してい0ます。

そのため、コードはwhileループに入り、条件変数を待機します。

条件変数を待機すると、待機が完了するまでミューテックスのロックが解除され、他のスレッドがミューテックスを取得できるようになります。

于 2013-02-26T12:57:37.803 に答える