Аз съм прилагане на ръчно нулиране събитие използване 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;