2013-02-26 4 views
3

Насколько я знаю, мьютексы должны блокироваться один раз, а затем блокировать других до освобождения, как это.Блокировка 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); 
+0

'int retcode = pthread_mutex_lock (& ​​queuemutex); assert (retcode == 0); ' – Sebivor

+1

Что такое' currentWaiting'? или, более конкретно, каково начальное значение «currentWaiting-> status»? – Hasturkun

ответ

7

Мои психические силы предполагают, что currentWaiting->status изначально 0.

Так как это так, ваш код входит в цикл while и ждет переменную условия.

Ожидание переменной состояния разблокирует мьютексы до тех пор, пока не завершится ожидание, позволяя другим потокам ее приобретать.

+0

+1 Это должно быть правильно. [pthread_cond_wait:] (http://linux.die.net/man/3/pthread_cond_wait) 'Эти функции атомарно отключают мьютекс и заставляют вызывающий поток блокировать условную переменную cond;' – Mike

+0

Превосходно, это должно быть, в противном случае логика мьютекса не имеет смысла. Так что, вообще говоря, нормально ли иметь cond_wait внутри мьютекса, в то время как кусок кода запускается несколькими потоками? Это не похоже на проблему для моей программы, это было просто разочарование! :) –

+0

безупречный ответ. Где ты взял свой пси. полномочия? ;) – didierc

Смежные вопросы