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.
}