epoll / select для мьютексов / семафоров - PullRequest
0 голосов
/ 22 июля 2011

Если у вас есть набор каналов / сокетов, ожидающих чтения / записи, epoll () или select () могут использоваться для ожидания всех из них, пока хотя бы один из них не будет готов для чтения / записи.

Есть ли что-нибудь похожее для потоков / pthreads? Самое близкое, что у меня есть, это создание спящего потока путем блокировки блокировки () для мьютексов. Однако для каждой блокировки это стоит потока.

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

Так что, да, есть ли лучшие решения, чем использование потоков для ожидания мьютексов для разблокировки?

Ответы [ 3 ]

3 голосов
/ 13 июня 2014

eventfd может быть полезным для вас.Они должны работать так же, как ваши каналы, но накладные расходы намного меньше.

Если вы превышаете ограничение в 1024 открытых файлов, вы можете увеличить его до желаемого уровня, используя ulimit.Но, если у вас много блокировок, вам нужно более разумно использовать eventfd.

Вот еще немного информации: http://man7.org/linux/man-pages/man2/eventfd.2.html

1 голос
/ 22 июля 2011

Я не знаю ни одного из таких методов, но вы можете переосмыслить дизайн, приводящий к такой проблеме.Если вы пытаетесь дождаться доступности нескольких мьютексов в неуказанном порядке (вероятно, блокируя некоторые из них в процессе), проблема «Обедающих философов», скорее всего, будет скрываться за углом.

Если это такне проблема, условная переменная, вероятно, путь.

0 голосов
/ 22 июля 2011

возможно, вы ищете условные переменные.См. Справочные страницы для pthread_cond_init, pthread_cond_wait и pthread_cond_signal.

Если один поток вызывает pthread_cond_wait (cond), он ожидает, пока второй поток вызовет pthread_cond_signal (cond)

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