2014-05-15 14 views
0

C++中的+=運算符是否線程安全?C++中+ =運算符的線程安全性

這是可以想像的情況下它不是(僞):

int a = 5; 

void thread1() { 
    a += 5; 
} 

void thread2() { 
    a += 5; 
} 

void main() { 
    start_thread1(); 
    start_thread2(); 
    //Prints 15 always, but i think 10 is not impossible. 
    printf ("%d\n", a); 
} 

很明顯,我必須使用互斥時+ =超載,但我一定要設置一個互斥時使用簡單的類型?

+1

從寫入有效的C++開始。 –

+5

從多個線程寫入相同(非原子)的數據不是「線程安全」的。 – juanchopanza

+2

@LightnessRacesinOrbit我認爲添加所有pthread樣板代碼不會影響問題的質量。 – Richard

回答

5

這是不是線程安全。

爲了在不使用阻塞(互斥鎖)的情況下獲得同步行爲,您可以使用C++ 11封裝器std::atomic

std::atomic<int> a{5}; 

void work() { 
    a += 5; // Performed atomically. 
} 

int main() { 
    std::thread t1{work}; 
    std::thread t2{work}; 

    t1.join(); 
    t2.join(); 

    std::cout << a << std::endl; // Will always output 15. 
} 
+1

另外還有一個typedef'std :: atomic_int;' – juanchopanza

+0

這對我有很大的幫助。非常感謝你。 – Richard

+0

請注意,這可能會使你的'+ ='操作成爲一個鎖定的RMW – Leeor

6

+=不是原子的,所以它確實不是線程安全的,你可以得到10。或者,坦率地說,牛從月球上彈出。也許比薩餅會圍繞着你的狗的鼻子。

+4

那麼,那隻狗不會抱怨... – user694733

+0

讓我們試試吧! :D –

+0

我會嘗試一下代碼。我的狗餓了,我沒有比薩餅。 –