2010-03-01 25 views
3

Pour un code concurrent, je veux connecter un groupe de signaux ensemble comme un circuit. En .NET, nous pouvons faire un WaitAll ou WaitAny sur une collection de signaux. Je veux faire quelque chose comme ceci:Comment connecter des signaux dans des circuits complexes dans .NET?

WaitAny (WaitAll (c1, c2), WaitAll (c3, c4)) ; 

Malheureusement, la bibliothèque ne supporte pas la composition de ces opérations dans des arbres plus complexes. Mes questions sont (1) Y at-il un moyen de faire cela dans .NET? (2) Y a-t-il une bibliothèque pratique dans toutes les langues?

[edit: Cory a demandé plus de détails]

Je veux construire une bibliothèque de passage de messages. Il pourrait y avoir 10K petites files d'attente concurrentes, certaines avec des messages. Je veux récupérer un message d'une file d'attente et exécuter un gestionnaire affecté à la file d'attente. Cependant, je ne peux pas récupérer le message suivant jusqu'à ce que le gestionnaire soit terminé (thread unique par file d'attente). Donc, vraiment, je veux attendre à la fois sur la file d'attente (j'ai un message?) Et le code (terminé avec le message précédent?) Avant de sauter et d'exécuter l'élément suivant.

Répondre

1

Je ne peux même pas croire que je suggère ceci mais vous pourriez avoir d'autres threads faisant les appels WaitAll et déclenchant des signaux séparés (un par groupe de WaitAll) que vous écoutez dans le WaitAny. Ça sent vraiment mauvais et semble trop complexe pour quelque chose qui devrait être simple. Je regrette sans doute en cliquant Post Your Answer ;-)

ManualResetEvent _Group1Event = new ManualReset(false); 
ManualResetEvent _Group2Event = new ManualReset(false); 

void SomeThread() 
{ 
    ... 
    WaitHandle.WaitAny(_Group1Event, _Group2Event); 
    ... 
} 

void Group1WatcherThread() 
{ 
    ... 
    if (WaitHandle.WaitAll(c1, c2)) 
    { 
     _Group1Event.Set(); 
    } 
    ... 
} 

void Group2WatcherThread() 
{ 
    ... 
    if (WaitHandle.WaitAll(c3, c4)) 
    { 
     _Group2Event.Set(); 
    } 
    ... 
} 

Je ne sais pas sur mes appels de méthode WaitAll/WaitAny mais l'exemple était destiné à démontrer l'idée fournit pas une solution complète.

+0

Je ne peux pas croire que je suis upvoting ce soit. :) – Tanzelax

+0

Malheureusement, cela permettrait d'allouer un fil pour chaque sous-arbre dans le circuit. Je veux presque 10K d'entre eux, donc cela ne sera pas à l'échelle. La conception de l'API est difficile car, par exemple, comment la valeur de retour vous dirait quel sous-arbre est réellement déclenché dans WaitAny? Pensez à des arbres de signaux vraiment fous. – projectshave

+0

@projectshave: Ya un thread par groupe ne serait pas à l'échelle mais vous pourriez créer un seul thread repsonsible pour le 'WaitAll' avec des délais d'expiration bas. Toujours pas évolutif. Le WaitAny retourne l'indice de l'objet dans le tableau que vous avez passé afin que vous sachiez quel signal a été déclenché. Peut-être que vous pourriez mettre à jour votre question avec le problème de base que vous essayez de résoudre et quelqu'un pourrait avoir une meilleure solution que la méthode WaitAny (WaitAll(), WaitAll()) que vous décrivez. –

-1

Je ne crois pas qu'il existe un support pour cela dans .NET, ni dans aucune langue. Je vais devoir le faire à la dure avec des primitives de bas niveau.

+0

Oui, il y a un moyen maintenant, Rx Extensions. –

+0

Si vous mettez à jour votre réponse, je peux annuler le vote. Je ne voulais pas voter ici. –