c++ - 在两个线程之间共享一个 int 时可能会出现什么问题?

标签 c++

两个线程访问一个共享的 int,x。指令重排序等会出现什么问题

线程 1:

x = 1;

线程 2:

obj.f(x);

如果 x 被声明为 volatile 会发生什么变化?
如果线程 1 和线程 2 在不同的内核上运行,会有什么变化?

最佳答案

Two threads accesses a shared int, x. What problems can arise from instruction reordering etc.

没有互斥体?不要那样做,否则你会冒着鼻恶魔的风险。 :-) 确切地说,任何事情都有可能发生。它甚至可能看起来有效(只要您不依赖一致的值)。但真的不要那样做。

What would change if x is declarared volatile?

不多,或者行为可能会有所不同,但您仍然得不到想要的东西。 volatile 变量用于处理诸如内存映射设备之类的事情,而不是欺骗您通过 CPU 缓存。

What would change if Thread 1 and Thread 2 runs on different cores?

问题会变得更糟(但您可能也不会立即看到任何差异)。没有互斥量或信号量,您将不会使用任何内存屏障;它们是使事情正常运行的关键(以及适当的锁以阻止一个线程在另一个线程正在写入时进行读取或写入)并且它们根本不是标准 C++ 的一部分。这就是您使用适当的线程原语的原因;他们为您解决了这些棘手的问题。

请注意,测试不能保证会发现线程一致性问题;它们天生就接近竞争条件,并且发生的情况通常会根据系统负载而改变。

关于c++ - 在两个线程之间共享一个 int 时可能会出现什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2659284/

相关文章:

c++ - 为什么这个参数包不能接受函数指针?

c++ - 字符串转换错误 : exceptions or error codes?

c++ - 是否可以在不编辑源文件的情况下为库(Eigen)中的类创建新功能? (C++)

c++ - 如何使用 QStandardPaths 获取 "ProgramData"路径

c++ - qdebug 流和 qtextedit 的未知输出

c++ - 有一个构造函数,但有两个析构函数

c++ - 请解释这是如何实现的

c++ - 为什么我需要将这个取消引用的迭代器分配给一个临时值?

c++ - 将 float 字符串转换为 float

C++ 指针 : overload operator++