2012-07-09 1 views
0

Supposons que j'ai partagé double variable. Thread A met à jour plusieurs milliers de fois par seconde. Dans un autre fil B je veux être averti d'une manière ou d'une autre au sujet de "mise à jour" chaque fois que cela se produit.technique sans verrouillage pour passer double mise à jour d'un thread à l'autre

j'essayé d'éviter les notifications complètement et il suffit d'utiliser la boucle while(true) mais cela introduit des ralentissements importants dans mon programme lock-free calc: how to sum N double numbers that are changing by other threads? probablement à cause de cela « En attendant, vous continuez sur le chargement de la même gamme de mémoire encore et qui ne sont pas vraiment bon pour la performance puisque la bande passante mémoire est limitée. "

J'ai également essayé d'utiliser la classe Monitor, mais il était également assez lent et j'ai vu jusqu'à 1-2 ms retards lorsque Monitor.TryEnter renvoient false.

Je pense maintenant que je dois faire des notifications en utilisant une technique sans verrouillage, en utilisant probablement SpinLock ou autre chose?

Répondre

3

Utilisez wait poignée pour notifier entre les fils

System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false); 
    double d = 0; 
    public void ThreadA(object state) 
    { 
     while (true) 
     { 
      d++; 
      are.Set(); 
     } 
    } 

    public void ThreadB(object state) 
    { 
     while (true) 
     { 
      are.WaitOne(); 
      double current = d; 
     } 
    } 
+0

i comme ça, mais la question est de savoir combien les frais généraux 'AutoResetEvent' introduire. – javapowered

+0

Je n'ai pas testé cela. Vous pouvez tester le bloc de code pour 1000 itérations et vérifier le temps nécessaire pour exécuter ces itérations, puis vérifier les mêmes itérations avec le verrouillage. alors vous pouvez connaître les résultats. – Waqar

0

Ne pas conserver le thread notifié tout le temps. Lorsque le thread A change la valeur, il doit notifier le thread B et passer à autre chose.

Questions connexes