Je suis sur le point de mettre en œuvre un thread de travail avec mise en file d'élément de travail, et pendant que je pensais à ce problème, je voulais savoir si je fais la meilleure chose.primitive de synchronisation pour léger file d'attente de thread de travail
Le fil en question devra avoir un fil de données locales (préinitialisés à la construction) et parcourera les éléments de travail jusqu'à ce qu'une condition sera remplie.
pseudocode:
volatile bool run = true;
int WorkerThread(param)
{
localclassinstance c1 = new c1();
[other initialization]
while(true) {
[LOCK]
[unqueue work item]
[UNLOCK]
if([hasWorkItem]) {
[process data]
[PostMessage with pointer to data]
}
[Sleep]
if(!run)
break;
}
[uninitialize]
return 0;
}
Je suppose que je vais faire le verrouillage par section critique, que la file d'attente sera std :: vecteur ou std :: file d'attente, mais peut-être il y a une meilleure façon. La partie avec le sommeil ne semble pas trop grande, car il y aura beaucoup de sommeil supplémentaire avec de grandes valeurs de sommeil, ou beaucoup de verrouillage supplémentaire lorsque la valeur de sommeil est faible, et ce n'est certainement pas nécessaire.
Mais je ne peux pas penser à une WaitForSingleObject amicale primitive que je pourrais utiliser au lieu de la section critique, comme il pourrait y avoir deux fils qui font la queue des éléments de travail en même temps. Ainsi, Event, qui semble être le meilleur candidat, peut perdre le deuxième élément de travail si l'événement a déjà été défini, et cela ne garantit pas une exclusion mutuelle.
Peut-être il y a même une meilleure approche avec InterlockedExchange type de fonctions qui conduit à encore moins sérialisation.
P.S .: Je pourrais avoir besoin de prétraiter toute la file d'attente et déposez les éléments de travail obsolètes au cours de la phase de unqueuing.
Si le verrouillage et le déverrouillage ne vous coûtent pas cher, est-ce que le fait de ne pas dormir est un problème? – DumbCoder
La sérialisation de 3 ou 4 threads, la gravure de l'unité centrale de traitement et l'exécution éventuelle de verrous-convoys ne sont probablement pas une très bonne chose. Et si je comprends bien, c'est ce qui arrivera sans Sleep ou WaitForSingleObject. Là encore, peut-être que je me trompe. – Coder
Comment les éléments de travail sont-ils livrés dans la file d'attente? –