Архитектура пула потоков и очереди заданий? - PullRequest
3 голосов
/ 08 марта 2012

У меня есть epoll для получения входящих событий и помещения их в очередь заданий.

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

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

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

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

Кроме того, я знаю, что очередь STL не является поточно-ориентированной.Означает ли это, что мне нужно каждый раз блокировать Mutex, когда я получаю доступ к очереди STL?Разве это не замедляет мой рабочий процесс?

Любые предложения по решению этой проблемы будут великолепны.

Ответы [ 2 ]

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

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

0 голосов
/ 10 марта 2012

Взгляните на пул потоков для кражи работы в .NET.Да, вам придется блокировать мьютекс глобальной очереди, для этого я написал двойную блокировку deque , чтобы операции на передней / задней части могли выполняться параллельно.У меня также есть блокировка без блокировки , но накладные расходы слишком высоки для клиентских приложений.

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