приостановить pthread? - PullRequest
       6

приостановить pthread?

0 голосов
/ 24 февраля 2012

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

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

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

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

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

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

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

0 голосов
/ 24 февраля 2012

mutex.lock () должен работать следующим образом:

1) проверять владельца блокировки 2) если блокировка принадлежит, поместить поток в очередь ожидания 3) приостановить этот поток до тех пор, пока THREAD, который владеет блокировкой, не отправит пробуждениесигнал вверх.Никакой другой поток не может снять блокировку.

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

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

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

0 голосов
/ 24 февраля 2012

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

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

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

...