posix pipe как рабочая очередь

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

Потребитель:

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.

На самом деле «Продюсер» в этом сценарии участвует в большом количестве операций ввода-вывода из большого количества источников параллельно. Так что подозреваю, что оригинальный автор хотя и очень хотел, чтобы эту ветку ни при каких обстоятельствах не блокировали, но и не хотел дорого работать в ветке "Продюсер".

5
задан Jonathan Leffler 12 August 2012 в 05:48
поделиться