PThread Mutex无法正常工作

时间:2013-02-25 23:47:07

标签: c multithreading thread-safety pthreads mutex

我正在使用互斥锁来尝试将对代码的某些部分的访问限制为一个线程,但是它似乎允许所有线程“锁定”,而不是锁定一次并阻塞其他线程。以下是我的代码,然后输出的一部分显示代码不起作用。

//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...

2 个答案:

答案 0 :(得分:3)

没有问题。

pthread_cond_wait(&amp; cond,&amp; queuemutex);

等待条件变量释放互斥锁。

答案 1 :(得分:1)

fceller所说的更长的版本是,pthread_cond_wait(&amp; cond,&amp; mutex)在返回之前做了三件事:它释放锁,然后等待信号,然后等待(如果需要的话) )重新获得锁定。

您的示例没有显示发送第一个信号的内容(如果有的话),并且没有显示工作线程正在等待的状态(如果有的话)。

这是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()方法。他们可能在不同的事情上运作,或者他们可能正在睡觉;但互斥锁确保在任何给定时间不超过一个线程(生产者或消费者)可以触及队列。