File d’attente de blocage pour les producteurs / consommateurs de threads pour win32 / C

J’essaie de remplacer une communication de fil par une queue personnalisée, le producteur utilise actuellement PostThreadMessage, le consommateur utilise WaitForSingleObject / PeekMessage.

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html serait ce dont j’avais besoin, mais boost ni C ++ ne sont pas une option.

Ne voulant pas réimplémenter la roue, est-ce que quelqu’un a une telle queue implémentée en C?

Utilisez un port d’achèvement IO (voir ici ) comme file d’attente; ils n’ont pas besoin d’être simplement liés aux opérations d’E / S; ils sont très faciles à utiliser et fonctionnent très bien en raison de la manière dont le kernel peut être configuré pour limiter le nombre de threads exécutés dans votre pool de threads.

En gros, vous appelez PostQueuedCompletionStatus() pour placer des éléments dans la queue et GetQueuedCompletionStatus() pour les supprimer. Vous n’avez pas à vous soucier de la synchronisation, etc.

Si vous avez besoin d’un peu plus d’aide pour le faire fonctionner, vous pouvez jeter un coup d’œil à mon infrastructure de serveur haute performance gratuite, qui inclut beaucoup de code IOCP, y compris un pool de threads autonome qui n’est aucunement lié à I / O. Notez que ceci est en C ++, mais cela devrait vous donner une bonne idée de la façon dont l’API C se bloque.

PostThreadMessage/WaitForSingleObject est le moyen approprié de mettre en queue les messages entre les threads sur win32.

Vous pouvez également utiliser SetEvent() (du producteur) et WaitForSingleObject() (ou WaitForMultipleObjects() si plusieurs files d’attente) (dans le consommateur) pour envoyer un indicateur indiquant qu’une queue personnalisée que vous avez écrite contient des éléments.

Le pseudo-code suivant décrit cette approche:

 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