Обычные реализации рабочей очереди, которые я видел, включают мьютексы и условные переменные.
A) Acquires Lock
B) While Queue empty
Wait on Condition Variable (thus suspending thread and releasing lock)
C) Work object retrieved from queue
D) Lock is released
E) Do Work
F) GOTO A
A) Acquires Lock
B) Work is added to queue
C) condition variable is signaled (potentially releasing worker)
D) Lock is released
Я был просматривая некоторый код, я увидел реализацию с использованием POSIX-каналов (раньше я не видел такой техники).
A) Do select on pipe (thus suspending thread while no work)
B) Get Job from pipe
C) Do Work
D) GOTO A
A) Write Job to pipe.
Поскольку производитель и потребитель являются потоками внутри одного и того одинаковое адресное пространство и, следовательно, указатели между ними действительны); задания записываются в конвейер как адрес рабочего объекта (объекта C++).Таким образом, все, что нужно записать/прочитать из канала, — это 8-байтовый адрес.
У меня такой вопрос:
Мое любопытство было задето, потому что метод пайпа не включает никаких видимых замков или сигналов (они могут быть скрыты в селекте). Поэтому мне было интересно, будет ли это более эффективным?
На основе комментариев в ответе @Maxim Egorushkin.
На самом деле «Продюсер» в этом сценарии участвует в большом количестве операций ввода-вывода из большого количества источников параллельно. Так что подозреваю, что оригинальный автор хотя и очень хотел, чтобы эту ветку ни при каких обстоятельствах не блокировали, но и не хотел дорого работать в ветке "Продюсер".