2016-07-01 4 views
5

ich std :: lese condition_variable auf http://en.cppreference.com/w/cpp/thread/condition_variable und ich verstehe das nicht:Gemeinsam genutzte Atom Variable nicht ordnungsgemäß veröffentlicht, wenn es nicht unter Mutex modifiziert

Auch wenn die gemeinsame Variable atomar ist, es muss unter dem Mutex geändert werden, um die Änderung im wartenden Thread korrekt zu veröffentlichen.

Warum wird eine gemeinsame atomare Variable nicht korrekt veröffentlicht, wenn sie nicht unter Mutex geändert wird? Wie kann ich diese Aussage verstehen?

Auf einer anderen Seite http://en.cppreference.com/w/cpp/atomic/atomic gibt es eine Anweisung, die auf die erste Mitteilung zu widersprechen scheint:

Wenn ein Thread zu einem Atom Objekt schreibt, während ein anderer Thread von ihm liest, wird das Verhalten wohldefinierte

+1

'std :: condition_variable' und' std :: atomic' sind zwei verschiedene Dinge. –

+0

Ich nehme an, dass der wartende Thread über den Mutex synchronisiert wird (sonst könnte es nicht "warten") und nicht über die atomare Variable. –

+5

Es ist über das letzte Beispiel in http://stackoverflow.com/a/32978267/2756719 –

Antwort

6

Betrachten Sie dieses Beispiel (Speichermodell für Details zu Daten Rennen sehen):

std::atomic_bool proceed(false); 
std::mutex m; 
std::condition_variable cv; 

std::thread t([&m,&cv,&proceed]() 
{ 
    { 
     std::unique_lock<std::mutex> l(m); 
     while(!proceed) { 
      hardWork(); 
      cv.wait(l); 
     } 
    } 
}); 

proceed = true; 
cv.notify_one(); 
t.join(); 

Hier werden die atomischen geteilten Daten proceed ohne die Verwendung eines Mutex geändert, nach dem eine Benachrichtigung an die Bedingungsvariable gesendet wird. Aber es ist möglich, dass zum Zeitpunkt, dass die Benachrichtigung gesendet wird, der Thread t nicht auf cv wartet: stattdessen ist es innerhalb hardWork() zuvor überprüft und festgestellt, dass es falsch ist. Die Benachrichtigung wurde verpasst. Wenn thardWork abgeschlossen ist, wird das Warten (vermutlich für immer) fortgesetzt.

Hätte der Haupt-Thread den Mutex vor dem Ändern der gemeinsamen Daten gesperrt, wäre die Situation vermieden worden.

Ich denke, dies ist die Situation bei der Aussage "Auch wenn die gemeinsame Variable atomar ist, muss sie unter dem Mutex geändert werden, um die Änderung im wartenden Thread korrekt zu veröffentlichen."

Verwandte Themen