linux pthread_suspend - PullRequest
       5

linux pthread_suspend

9 голосов
/ 08 июня 2010

Похоже, что Linux не реализует pthread_suspend и продолжает, но мне действительно нужно их.

Я пробовал cond_wait, но он слишком медленный.Работа, выполняемая с резьбой, в основном выполняется за 50 мкс, но иногда выполняется свыше 500 мс.Проблема с cond_wait двоякая.Блокировка мьютекса требует времени, сравнимого с выполнением микросекунд, и мне не нужна блокировка.Во-вторых, у меня много рабочих потоков, и я не хочу создавать N условных переменных, когда их нужно разбудить.

Я точно знаю, какой поток ожидает какую работу, и мог бы просто pthread_continue продолжить этот поток.Поток знает, когда больше нет работы, и может легко выполнить pthread_suspend.Это будет использовать без блокировки, избежать давки и будет быстрее.Проблема в том ... нет pthread_suspend или _continue.

Есть идеи?

Ответы [ 5 ]

7 голосов
/ 08 июня 2010

Заставить поток ожидать определенного сигнала.

Использовать pthread_sigmask и sigwait .

2 голосов
/ 08 июня 2010

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

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

0 голосов
/ 15 сентября 2011

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

0 голосов
/ 11 июня 2010

Может быть попробовать вариант pthread_cancel, но будьте осторожны, если какие-либо блокировки будут сняты, прочитайте страницу руководства, чтобы определить состояние отмены

0 голосов
/ 08 июня 2010

Мне кажется, что такое решение (то есть с использованием "pthread_suspend" и "pthread_continue") неизбежно является чудовищным.

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

(Обратите внимание, что это не относится к методам приостановки, которые позволяют ставить «продолжить» в очередь, как методы sigwait() и read(), упомянутые в других ответах).

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