где разблокировать мьютекс в pthread? - PullRequest
3 голосов
/ 28 августа 2011

Полезно ли блокировать мьютекс из основного потока и освобождать из другого потока?

Или я должен убедиться, что поток сделает все это в одном? то есть: заблокировать и разблокировать

Ответы [ 4 ]

8 голосов
/ 28 августа 2011

http://www.manpagez.com/man/3/pthread_mutex_unlock/

(также с сайта спецификации POSIX: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html)

Если текущий поток удерживает блокировку мьютекса, то pthread_mutex_unlock () Функция разблокирует мьютекс.

Вызов pthread_mutex_unlock () с мьютексом, который не содержит вызывающий поток, приведет к неопределенному поведению.

3 голосов
/ 28 августа 2011

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

Если вам действительно нужно такое поведение (блокировка одним потоком и разблокировка другим), семафор может удовлетворить ваши потребности.Семафоры не имеют владельцев, и любой поток может в любое время вызвать sem_post или sem_wait.

0 голосов
/ 28 августа 2011

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

0 голосов
/ 28 августа 2011

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

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