Конфликтуют pthread_cond_wait и pthread_mutex_unlock? - PullRequest
3 голосов
/ 30 июня 2011

Я реализую событие ручного сброса, используя 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)

Спасибо.

1 Ответ

9 голосов
/ 30 июня 2011

Стандарт говорит:

При успешном возврате мьютекс заблокирован и принадлежит вызывающему потоку.

Что означаетчто при возврате pthread_cond_wait атомарно блокирует связанный мьютекс.

Рабочий процесс выглядит следующим образом:

  • Вы блокируете мьютекс
    • pthread_cond_wait атомно блокирует и разблокирует мьютекс (чтобы другие потоки могли попасть сюда)
    • Когда наступает условие, pthread_cond_wait атомарно возвращает и блокирует мьютекс
  • Youразблокировать мьютекс

Я не думаю, что pthread_cond_wait блокирует и разблокирует

Это потому, что вы не читали предоставленную мной ссылку.

Эти функции атомарно освобождают мьютекс и заставляют вызывающий поток блокировать в условной переменной cond;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...