В C / C ++ на Linux, как я могу создать предварительно заблокированный мьютекс - PullRequest
2 голосов
/ 08 марта 2012

Какой атрибут я использую для создания мьютекса pthreads, который блокируется потоком создания во время создания?

Ответы [ 4 ]

2 голосов
/ 08 марта 2012

Похоже, он не поддерживается интерфейсами мьютекса pthreads. Вам придется взаимно блокировать его и использовать какой-то другой метод синхронизации, чтобы другие потоки не могли его захватить, прежде чем вы это сделаете (что, как я предполагаю, вы хотите сделать здесь) в полупсевдокоде ниже:

pthread_mutex_lock(my_pthread_creation_mutex);

pthread_mutex_init(new_mutex, mutex_attributes);
pthread_mutex_lock(new_mutex);

pthread_mutex_unlock(my_pthread_creation_mutex);
2 голосов
/ 08 марта 2012

Самое близкое, что вы можете получить с тем, что вы хотите, это использовать семафоры.Они могут быть инициализированы с определенным значением.В Linux (как у вас есть этот тег) man sem_overview должен дать вам хорошее введение в эту тему

1 голос
/ 08 марта 2012

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

pthread_mutex_init(&mutex, &prelocked_attr);
/* done */

против

pthread_mutex_init(&mutex, 0);
pthread_mutex_lock(&done);
/* done */

В обоих случаях любой другой поток будет пытаться каким-либо образом получить доступ к мьютексу до того, как создающий поток достигнет комментария "done", и впоследствии выполнит действие, которое позволит другим потокам узнать, что мьютекс существует.

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

1 голос
/ 08 марта 2012

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

...