2012-02-23 4 views
0

Я хочу реализовать блокировку мьютекса. Из моего понимания, mutex.lock() должен работать как 1) проверка блокировки владельца 2), если замок находится в собственности, положить нить в очереди ожидания 3) приостановить этот поток до другого потока отправить жди сигналприостановить pthread?

Однако нет ничего похожего на pthread_suspend(), а затем как приостановить? Я обнаружил, что кто-то говорит, что использует pthread_con_wait(), но кажется, что если я хочу использовать эту функцию, мне нужно сначала установить блокировку pthread_mutex, которая не имеет смысла использовать pthread_mutex внутри моего мьютекса.

Ну, если мое понимание мьютекса неверно, пожалуйста, исправьте меня.

Спасибо.

ответ

0

mutex.lock() должен работать как:

1) проверить блокировки владельца 2), если замок находится в собственности, положить нить в очередь ожидания 3) приостановить эту нить, пока ЧТО ВЛАДЕЕТ локировка посылает сигнал пробуждения. Ни одна другая нить не может освободить замок.

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

«Тем не менее, нет ничего похожего на pthread_suspend(), то как мне приостановить?» - Как правило, вы этого не делаете. Ядро ОС предоставляет примитивы синхронизации, которые могут блокировать потоки, которые не должны запускаться.Чтобы реализовать «приостановку» в пользовательском пространстве, вы можете только «оживить» - что-то, что является хорошей стратегией в нескольких случаях (недогруженный многоядерный ящик, где блокировка удерживается только на очень короткое время), но, безусловно, не все (и могут привести к поразительно губительным ливням в целых скоплениях машин).

Если вы хотите использовать мьютексы, используйте мьютексы OS - вот что такое кросс-платформенная lib. Сделаю.

+0

то что делает проверка спин-ожидания (после того, как поток вставлен в Q)? как это? «while (lockOwner! = self)», тогда в чем разница между этим и блокировкой спина ... – user956159

0

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

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

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

2

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

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

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

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

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