Я реализую событие ручного сброса, используя 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 и заставляет вызывающий поток блокировать переменную условия cond;
- pthread_mutex_unlock:
Пытается разблокировать указанный мьютекс. Если тип мьютекса - PTHREAD_MUTEX_NORMAL, обнаружение ошибок не предусмотрено. Если поток пытается разблокировать мьютекс, который не заблокирован , или мьютекс, который разблокирован, это приводит к неопределенному поведению.
Что меня пугает, так это когда pthread_cond_wait освобождает мьютекс, тогда pthread_mutex_unlock может привести к неопределенному поведению (это может свести меня с ума, почему они не справляются :-D)
Спасибо.