在我审查的一个代码库里, 我发现了以下的智商。
void notify(struct actor_t act) {
write(act.pipe, "M", 1);
}
// thread A sending data to thread B
void send(byte *data) {
global.data = data;
notify(threadB);
}
// in thread B event loop
read(this.sock, &cmd, 1);
switch (cmd) {
case M : use_data(global.data);break;
...
}
“等等”,我对我的团队的一名资深成员,即提交人说,“这里没有记忆屏障!你不能保证global.data
将从缓存冲到主内存。如果线A和线B将在两个不同的处理器中运行,这个办法可能失败。”
资深程序员笑着, 并缓慢地解释, 好像解释他的五岁男孩如何系鞋带: “听着,小男孩,我们在这里看到许多与线条有关的虫子, 在高负荷测试中,
"但书上写着..."
“安静 ”, 他迅速给我闭嘴, “也许理论上说,它没有保证,但实际上,你使用的函数调用实际上是一个记忆屏障。 编译者不会重新排序指令 global. data= data
, 因为它不能知道是否有人在调用该指令时使用, 而 x86 架构将确保其他CPU在B 读取管子指令时会看到这块全球数据。 放心吧, 我们有足够的真实的世界问题需要担心。 我们不需要在假理论问题上投入额外的精力。
"我向我儿子保证,你将理解 将真正的问题与我-需要- 需要- 需要-
这在实际中是否真的不是一个问题(X86、x64和ARM)?
这和我学到的一模一样 但他的胡子长着 长得很聪明
额外的点数,如果你能给我看一个代码 证明他错了!