В многопоточных приложениях иногда возникает необходимость создать producer/consumer очередь. Наилучший вариант это использовать для этого готовую библиотеку. Если по каким-то причинам этого сделать нельзя, то такую очередь можно реализовать самому. Как правило, для этого используются механизмы синхронизации mutex и condition variables.
Интерфейс синхронизации различается от среды к среде, поэтому приходится либо писать высокоуровневую обертку, либо брать за основу интерфейс какой-то среды и реализовать его для других. К примеру, можно взять за основу интерфейс pthread
, и для Windows реализовать функции pthread_mutex_*
и pthread_cond_*
, на основе которых уже построить очередь.
Существует более легкий способ. Он заключается в том что можно создать сокет пару (socketpair) или трубу (pipe) из двух связанных дескрипторов, отдать пишущий конец трубы поставщику (producer), а читающий конец отдать всем потребителям (consumers). Читать полностью »