Dipende da come m_cur viene modificato. Se sta usando una normale istruzione di assegnazione come m_cur--;
, allora deve essere volatile. Tuttavia, se viene modificato utilizzando una delle operazioni Interlocked, ciò non avviene perché i metodi di Interlocked inseriscono automaticamente una barriera di memoria per garantire che tutti i thread ottengano il memo.
In generale, l'opzione preferibile è l'utilizzo di Interlock per modificare valori atomici condivisi tra thread. Non solo si prende cura della barriera di memoria per te, ma tende anche ad essere un po 'più veloce rispetto ad altre opzioni di sincronizzazione.
Detto questo, come altri hanno detto che i cicli di polling sono enormemente dispendiosi. Sarebbe meglio mettere in pausa il thread che deve aspettare, e lasciare che chiunque modifichi m_cur si faccia carico di svegliarlo quando arriverà il momento. Sia Monitor.Wait() and Monitor.Pulse() e AutoResetEvent potrebbero essere adatti all'attività, a seconda delle esigenze specifiche.
fonte
2012-04-25 00:59:52
Effettua l'int una proprietà e segnala il thread, (autoResetEvent, forse), nel metodo setter. Problema aggirato, utilizzo della CPU ridotto, dubbio volatile rimosso. –
Questa è in genere una cattiva idea tranne in alcuni rari casi; ti capita di sapere quanti microsecondi al massimo ti aspetti di girare? –
Il ciclo della CPU durante la lettura di 'cur' che viene scritto da un altro thread non sarà in grado di rilevare la fine fuori limite se il thread di polling non è in esecuzione quando il thread setter scrive un valore fuori limite. Se è stato preimpostato su un box sovraccarico, dovrà aspettare un mezzo-a-quantum medio prima di rilevare il parametro out-of-range.Se il cur diventa di nuovo nel raggio di copertura mentre il poller non è in esecuzione, non rileverà affatto la condizione di fuori portata. –