互斥锁多次锁定

时间:2013-02-26 12:37:52

标签: c multithreading concurrency pthreads mutex

据我所知,互斥锁应该锁定一次,然后阻止其他人,直到被释放,就像这样。

enter image description here

但是使用我的代码,似乎多个线程锁定了相同的互斥锁。我有一个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);

1 个答案:

答案 0 :(得分:7)

我的精神力量表明currentWaiting->status最初是0

由于这种情况,您的代码进入while循环并等待条件变量。

等待条件变量解锁互斥锁,直到等待完成,允许其他线程获取它。