/ / Има ли конфликт между pthread_cond_wait и pthread_mutex_unlock? - c ++, multithreading, pthreads

Има ли конфликт между pthread_cond_wait и pthread_mutex_unlock? - c ++, multithreading, pthreads

Аз съм прилагане на ръчно нулиране събитие използване pthread в Linux, което е подобно на WaitForSingleEvent в Windows. Намерих този пост

pthread-подобен прозорец ръчно нулиране събитие

и след това, но има нещо, което ме обърква:

void mrevent_wait(struct mrevent *ev) {
pthread_mutex_lock(&ev->mutex);
while (!ev->triggered)
pthread_cond_wait(&ev->cond, &ev->mutex);
pthread_mutex_unlock(&ev->mutex);
}
  • pthread_cond_wait: Атомно освобождаване на mutex и предизвикване на вика конец за блокиране на condition променлива cond;
  • pthread_mutex_unlock: Опитите за отключване на посочения мутекс. Ако типът мутекс е PTHREAD_MUTEX_NORMAL, не е открито грешка. Ако нишка се опитва да отключи mutex, който е не е заключена или mutex, който е отключен, недефинирано поведение.

Това, което ме плаши, е, когато pthread_cond_wait пусне mutex, тогава pthread_mutex_unlock може да дойде недефинирано поведение (този вид нещо ще ме кара луд, как да не се справят с него :-D)

Благодаря ти.

Отговори:

9 за отговор № 1

Стандарт казва:

При успешно връщане, mutex има е заключена и е собственост на викащ нишка.

Което означава, че когато се връщате, pthread_cond_wait атомично заключва свързания мутекс.

Работният процес е по следния начин:

  • Заключвате мутекс
    • pthread_cond_wait атомно блокира и отключва мутекса (така че други теми могат да стигнат тук)
    • Когато се стигне до състояние, pthread_cond_wait атомно връща и заключва мутекса
  • Отключвате мутекса

Не мисля, че pthread_cond_wait блокове и отключва

Това е така, защото не прочетохте връзката, която предоставих.

Тези функции атомно освобождаване mutex и да предизвикате колката на повикване блок на условието променлива cond;