2016-10-11 3 views
0

ich in vielen Threads eine Funktion foo Lauf haben (std::thread t([&]() { foo(a); }):std :: atomics und std :: lock_guard oder nur std :: lock_guard

void foo(int a) 
{ 
    if (x && y != a) 
    { 
     ++x; 
     y = a; 
     vec.push_back(std::chrono::high_resolution_clock::now()); 
    } 
} 

I int x, int y und std::vector<> vec gegen Race-Bedingung schützen müssen . Was ist die beste Lösung?

Um x und y als std::atomic zu definieren und std::lock_guard(mutex) verwenden, bevor zu vec schieben.

Oder std::lock_guard für den ganzen Körper von if Aussage?

Oder vielleicht eine bessere Lösung?

+6

Persönlich würde ich das ganze Ding sperren, da die ganze Operation scheint, wie es nicht verschachtelt werden sollte. – NathanOliver

+2

Nachdem du getestet hast, ob 'y! = 5 'dir was ausmacht, wenn ein anderer Thread' y' ändert, bevor du zur Zeile 'y = 5' kommst? – Galik

Antwort

0

Dies hängt etwas davon ab, was die Threads während der restlichen Zeit tun, wo x und y verwendet werden, aber als allgemeine Faustregel gilt, je weniger Sperren Sie ausführen, desto besser.

1

Ohne mehr Kontext ist es schwer sicher zu sein, aber es sieht so aus, als ob Sie y verwenden und ändern, also müssen Sie es wahrscheinlich vor der if bis nach der Zuweisung sperren. Das kann nicht mit einem std::atomic getan werden. Da Sie diese Code-Region dann mutexen, erhalten Sie (hier) wenig Nutzen davon x atomar zu machen. Aber Sie haben uns nichts vorgelesen, also ist es schwer zu sagen.

Verwandte Themen