2017-02-02 9 views
1

При работе с семафорами, часто для обеспечения синхронизации между потоками, мне полезно инициализировать семафор до нуля.Posix: Как инициализировать мьютекс в заблокированном состоянии?

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

Можно ли это сделать и с мьютексами?

Я объясняю лучше: когда я инициализирую Mutex Posix (например, через pthread_mutex_init(&mutex,NULL)), он обычно инициализируется в незаблокированном состоянии, так что первый поток, пытающийся заблокировать его, будет успешным.

Мне было интересно, есть ли способ инициализировать мьютексы в заблокированном состоянии (эквивалент использования sem_init(&sem,0,0) с семафором), возможно, используя некоторые атрибуты для мьютекса или что-то еще.

ответ

1

К сожалению, не существует способа инициализировать мьютекс заблокированного состояния. По opengroup: функция

pthread_mutex_init() должен инициализировать семафор, на который ссылается мьютекса с атрибутами, указанными при ATTR. Если attr равно NULL, используются атрибуты mutex по умолчанию; эффект должен совпадать с передачей адреса объекта атрибутов mutex по умолчанию. После успешной инициализации состояние мьютекса будет инициализировано и разблокировано.

Таким образом, мы должны заблокировать его вручную. Функция обертки может сделать вещи менее уродливыми :-)

 Смежные вопросы

  • Нет связанных вопросов^_^