Code Monkey home page Code Monkey logo

Comments (8)

xiaoweiChen avatar xiaoweiChen commented on May 1, 2024

我先将你在 #31 下面补充的问题粘贴过来,

我再次看了一下你说的, 但是上面的那段代码是来至于Cpp_Concurrency_In_Action的第5章128页,用的是std::memory_order_relaxed 而非 std::memory_order_seq_cst.

我的本意是,看那段代码,很难看到z=0的结果,不知道是不是我理解有误。谢谢

from cpp_concurrency_in_action.

xjj210130 avatar xjj210130 commented on May 1, 2024

@xiaoweiChen 我也把你上次的回答看了一下,感觉z=0不太容易,我的意思是,怎么那么多的人没有对这个地方有怀疑。非常感谢你的回答。

from cpp_concurrency_in_action.

xiaoweiChen avatar xiaoweiChen commented on May 1, 2024

我回看了一下书中的具体章节,其实和代码没有什么关系。

你可以看一下 图5.4 非限制原子操作与先发执行 这张图

图5.4 非限制原子操作与先发执行

然后结合图上方的段落来看:

非限制操作对于不同变量可以自由重排序,只要它们服从任意的先发执行关系即可(比如,在同一线程中)。它们不会引入同步相关的顺序。清单5.5中的先发执行关系如图5.4所示(只是其中一个可能的结果)。尽管,在不同的存储/加载操作间有着先发执行关系,这里不是在一对存储于载入之间了,所以载入操作可以看到“违反”顺序的存储操作。

这里,因为使用了memory_order_relaxed而没有了顺序限制,所以代码中所展示的执行顺序,并非在机器上的真正执行顺序,其可能会被编译器优化。因为对于write_x_then_y函数来说,只要存储过程是原子的,顺序都是无所谓的,所以有可能出现y先与x存储。这里并不是你代码写的问题,所以我说和代码无关,编译器会将你的代码重新排序,对于指令进行一定的优化。
我想这段代码你也运行过,不过可能大多数情况下是在Debug模式下,编译器不会对指令做任何修改,所以你几乎看不到z为0的情况。

我在 #31 中写的是memory_order_seq_cst原子序,强制了存储顺序也要相同,所以不会看到z不为0的情况。

带标签 memory_order_seq_cst 的原子操作不仅以与释放/获得顺序相同的方式排序内存(在一个线程中先发生于存储的任何结果都变成做加载的线程中的可见副效应),还对所有拥有此标签的内存操作建立一个单独全序。

带标签 memory_order_relaxed 的原子操作无同步操作;它们不会在共时的内存访问间强加顺序。它们只保证原子性和修改顺序一致性。

引用于https://zh.cppreference.com/w/cpp/atomic/memory_order

from cpp_concurrency_in_action.

xiaoweiChen avatar xiaoweiChen commented on May 1, 2024

如果程序死锁,那么主函数是不是就一直不能退出,那么这种情况下,z=0就没有意义了.

这个是不存在的,原子序不涉及到锁。死锁的话,得有锁,没有锁,就没有死锁。

from cpp_concurrency_in_action.

xjj210130 avatar xjj210130 commented on May 1, 2024

@xiaoweiChen 因为对于write_x_then_y函数来说,只要存储过程是原子的,顺序都是无所谓的,所以有可能出现y先与x存储----是不是可以这么理解,
void write_x_then_y()
{
x.store(true,std::memory_order_relaxed); // 1
y.store(true,std::memory_order_relaxed); // 2
}
第2步可能比第1步先执行?
一般来说,CPU的优化不能把编程者的思路优化反了。
如果1,2两步,分别代表两个函数行为,那么优化后(2,1),则期望可能与编程者不一致。
还是只有两个无关的变量,CPU能够优化其load/store顺序?从目前来看,貌似是后面一个理解?不知道我的理解对不。
非常感谢

from cpp_concurrency_in_action.

xiaoweiChen avatar xiaoweiChen commented on May 1, 2024
  1. 第2步可能比第1步先执行?
    A:是的,你可以看下书中的那副图 https://github.com/xiaoweiChen/Cpp_Concurrency_In_Action/blob/master/images/chapter5/5-4.png 其就是这样的一个表示。

  2. CPU的优化不能把编程者的思路优化反了
    A:起到优化作用的是编译器,不是CPU。CPU在这里只是程序的执行者。并且,在编译器看来这两行代码的确可以互换位置因为没有什么影响。目前的程序的编译优化,只看依赖,不看别的。你要不明确告诉机器这里不能怎样做,它不会明白的。也就是说,机器没有办法理解编程者的“思路”。机器不会管是否与你的期望一致,它只是按指令行事。

  3. 还是只有两个无关的变量,CPU能够优化其load/store顺序?
    A:只要是两个没有互相依赖关系的变量,在编程人员没有显式阻止编译器进行优化时,开启优化选项时,指令就可能会重排。也就是说,你的代码的执行顺序,可能和你想象的完全不一样。

非限制操作对于不同变量可以自由重排序,只要它们服从任意的先发执行关系即可(比如,在同一线程中)。它们不会引入同步相关的顺序。清单5.5中的先发执行关系如图5.4所示(只是其中一个可能的结果)。尽管,在不同的存储/加载操作间有着先发执行关系,这里不是在一对存储于载入之间了,所以载入操作可以看到“违反”顺序的存储操作。

这段话,我觉你需要再好好看一下。尤其是第一句。

from cpp_concurrency_in_action.

xjj210130 avatar xjj210130 commented on May 1, 2024

非常感谢,把后面的看完,加深了一下理解。

from cpp_concurrency_in_action.

xiaoweiChen avatar xiaoweiChen commented on May 1, 2024

好!多线程会比较复杂,所以有时候不能以单线程的角度来看。得把自己精分成多个来考虑多线程的问题 :)

第5章算是这本书比较难弄懂的地方,我当时翻译的时候,也没有完全弄明白。如果觉得我翻译有问题的时候,可以参考下英文原版。方便的话,把觉得翻译不当的地方告诉我,或者是给我提pull request。

from cpp_concurrency_in_action.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.