我有一个可用的x。 线程 1 读写 x。 然后线程 2 读写 x,这肯定会在线程 1 修改后发生。
int x;
void task(){
++x;
}
// 1. thread 1 runs task()
// 2. after 1 finished, thread 2 runs task()
// 3. goto 1 or 2
在这种情况下,线程肯定不会同时访问x,我是否需要使用原子或互斥来确保线程1的修改对线程2可见?
我猜这是 C++ 标准未定义的行为? 但在实际中它能正常工作吗?
我在阅读boost asio示例时遇到了这个问题。 异步接收操作在时间线上始终是连续的,但可以由不同的线程执行(尽管该示例仅使用一个工作线程)。我想知道接收处理程序中的普通(无原子或互斥)成员可修改是否可以正常工作。
通常,无论运行您的线程,这都是合法的。例如,
std::thread
:
std::thread::thread(func)
构造函数:
构造函数调用的完成与新执行线程上 f 副本的调用开始同步。
(粗体我的)
:由(粗体我的)
*this
标识的线程的完成与join()
相应的成功返回同步。
请参阅
this想必 ASIO 也会这样做。