Очередь блокировки для производителя потоков / потребителей для win32 / C - PullRequest
4 голосов
/ 27 января 2010

Я пытаюсь заменить какую-то связь потока с пользовательской очередью, производитель в настоящее время использует PostThreadMessage, потребитель использует WaitForSingleObject / PeekMessage.

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html было бы то, что мне было нужно, но Boost или C ++ не вариант.

Не желая переопределить колесо, есть ли у кого-нибудь такая очередь, реализованная в C?

Ответы [ 2 ]

6 голосов
/ 27 января 2010

Используйте порт завершения ввода-вывода (см. здесь ) в качестве своей очереди; они не обязательно должны быть просто связаны с операциями ввода-вывода и очень просты в использовании и работают очень хорошо благодаря тому, как ядро ​​может быть настроено на ограничение числа потоков, которые запускаются в вашем пуле потоков.

Обычно вы звоните PostQueuedCompletionStatus(), чтобы поместить элементы в очередь, и GetQueuedCompletionStatus(), чтобы снять их. Вам не нужно беспокоиться о синхронизации и т. Д.

Если вам нужна дополнительная помощь для того, чтобы заставить его работать, вы можете взглянуть на мою бесплатную высокопроизводительную серверную платформу , которая включает в себя довольно много кода IOCP, включая отдельный пул потоков, который никак не связан с вводом / выводом. Обратите внимание, что это в C ++, но оно должно дать вам хорошее представление о том, как C API висит вместе.

1 голос
/ 27 января 2010

PostThreadMessage/WaitForSingleObject - это подходящий способ организации очереди сообщений между потоками на win32.

Вы также можете использовать SetEvent() (от производителя) и WaitForSingleObject() (или WaitForMultipleObjects(), если несколько очередей) (у потребителя), чтобы отправить флаг о том, что у написанной вами пользовательской очереди есть элементы.

Следующий псевдокод описывает этот подход:

in producer...
   ...
   create item
   acquire_lock
   push item onto queue
   release_lock
   SetEvent(...)
   ...

in consumer...
   while(true)
      WaitForSingleObject(event)
      acquire_lock
      pop item from queue
      release_lock
      process item
      release item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...