C++中运算符+=操作符的线程安全性 是C++线程安全的+=运算符?< /P>

C++中运算符+=操作符的线程安全性 是C++线程安全的+=运算符?< /P>,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,可以想象一种不是伪代码的情况: 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); } 很明显,当+=重载时,我必须

可以想象一种不是伪代码的情况:

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);
}
很明显,当+=重载时,我必须使用互斥体,但在处理简单类型时,我必须设置互斥体吗?

+=不是原子的,因此它确实不是线程安全的,您可以得到10。或者,坦率地说,奶牛被从月球上赶出来。也许你的狗鼻子周围会出现一块披萨。

它不安全

要在不使用阻塞互斥体的情况下获得同步行为,可以使用C++11包装器std::atomic


从编写有效C++开始。从多个线程写入相同的非原子数据不是线程安全的。@ LeNNESSraceSin轨道,我认为添加所有的ptho-代码板代码不会有助于问题的质量。@李察:开始使用主的原型,而且没有那么多的样板文件。@Richard:给main提供正确的返回类型,包括所需的头,并在语句末尾写分号当然会更好。然后,在C++11中,实际上没有任何用于启动线程的样板文件,因此您可以很容易地用比这个(如果有的话)更少的代码展示一个可编译的示例!。没有人再写pthread初始化代码了。。。从2001年开始?!还请注意,有一个typedef std::atomic_int;这对我帮助很大。非常感谢。请注意,这可能会使您的+=操作成为锁定的操作。RMWI将尝试此代码。我的狗饿了,我没有比萨饼。
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.
}