众所周知,编译器或 CPU 可以根据需要重新排序执行,前提是它们遵循 as-if 规则。例如,如果我们有这样一段代码:
C = A + B;
D = E + F;
编译器或 CPU 可能会D = E + F
在C = A + B
. 我可以理解。
现在让我们谈谈另一个案例。
说我有两个线程a
和b
. 我想在执行时设置一些标记,以便我可以监控和的整个a
过程b
。
queue q; // thread safe
void thread_a()
{
// do something
q.push("a - 1");
// do something
q.push("a - 2");
}
void thread_b()
{
// do something
q.push("b - 1");
// do something
q.push("b - 2");
}
我的问题是:既然我们有 as-if 规则并且执行顺序可能会重新排序,是否意味着其中的消息q
不可靠?意思是真正的执行顺序是a - 1
, b - 1
,但其中可能有, ,b - 2
和? 如果可能发生这种情况,我应该如何设计或使用哪种技术来监控多线程进程?a - 2
q
a - 1
a - 2
b - 1
b - 2