Сигнализация переменной условия (pthreads) - PullRequest
5 голосов
/ 03 марта 2011

Предположим, что некоторая условная переменная "cond" связана с переменной мьютекса "mutex". Если поток спит на cond после вызова pthread_cond_wait(&cond,&mutex), а другой поток с заблокированным mutex завершен, имеет ли значение, вызывает ли этот поток pthread_cond_signal(&cond) до или после вызова pthread_mutex_unlock(&mutex)? Нужно ли вообще разблокировать мьютекс, если он вызывает pthread_cond_signal(&cond), так как спящий поток все равно получит мьютекс?

РЕДАКТИРОВАТЬ: Согласно https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview, «Если не разблокировать мьютекс после вызова pthread_cond_signal (), возможно, не удастся завершить соответствующую процедуру pthread_cond_wait () (она останется заблокированной)». Полагаю, тогда требуется разблокировка и, возможно, только потом.

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Если вы удерживаете мьютекс заблокированным, то пробуждаемый поток не может получить мьютекс, поэтому блокируется в pthread_cond_wait, ожидая повторного получения мьютекса.

Вам не нужно удерживать мьютекс заблокированным для вызова pthread_cond_signal. На самом деле, если логика вашего приложения может работать с сигналом, когда мьютекс не заблокирован, то это лучший способ сделать это - ОС может сразу планировать ожидающий поток, и ей не нужно ждать сигнализации поток, чтобы разблокировать мьютекс перед продолжением.

Тем не менее, в этом сценарии необходимо позаботиться о том, чтобы пробуждение не было потеряно, и у вас не было проблем с пробуждением «неправильного» потока. Если вы используете прямой предикат, на практике это не должно быть проблемой.

3 голосов
/ 03 марта 2011

Вы должны всегда разблокировать мьютекс после вызова pthread_cond_signal. Вот несколько хороших вопросов / ответов для чтения:

Вызов pthread_cond_signal без блокировки мьютекса

Это не придет ко мне прямо сейчас, но я уверен, что есть веская причина (с точки зрения условий гонки), что вы не хотите разблокировать мьютекс перед сигналом.

...