gpt4 book ai didi

c++ - asio::io_service::post 是否使关系发生在发生之前?

转载 作者:太空狗 更新时间:2023-10-29 23:14:47 24 4
gpt4 key购买 nike

boost::shared_ptr<A> a = boost::shared_ptr<A>(new A);
a->i = 2;
strand.post([a](){assert(a->i == 2)});

io_service.post([a](){assert(a->i == 2)});

当我将处理程序发布到线程 1 中的 strand 或 io_service 时,执行处理程序的线程 2 是否在发布之前看到数据更改?

Java 有类似的东西 Executor 可以建立 happen-before 关系:

Actions in a thread prior to the submission of a Runnable to an Executor happen-before its execution begins. Similarly for Callables submitted to an ExecutorService.

asio 呢?

请注意,此问题不会询问发布到 io_service 或 strand 的处理程序的执行顺序。 Asio doc说如果使用 strand,post(a) happen-before post(b)。但是这个问题问:在(编码顺序)post(a)之前的 Action 是否发生在 post(a)(处理程序 a 的执行)之前?这是关于内存模型的。让我澄清一下:

// in thread1
global variable a = 111;
start a new thread2 which will access global variable a

我们知道线程 1 中的操作在线程 2 启动之前发生在线程 2 启动之前。也就是说: 1、最终执行顺序与代码顺序相同(编译器或CPU不会改变顺序)。 2、global variable a value set action会刷新到主内存(或者同步到thread2的CPU cache),然后thread2会更新到global variable a的最新值(当然, 直到它开始)。

asio的帖子和这个例子类似,所以我问这个问题。我觉得asio的帖子应该make happen-before关系,不然就没用了。但是我不确定,我想知道 asio 是怎么做到的。

要让happen-before,有3种方式:1,线程启动,加入。 2、锁定和解锁互斥体。 3、内存障碍。

最佳答案

以下所有对象在内存排序上都存在先行关系:io_service::post()io_service::dispatch()strand: :post()strand::dispatch()。这主要是 io_servicestrand 为单个对象可以并发使用提供强有力保证的结果。在这种不需要潜在阻塞同步的情况下,例如当发布到 dispatch() 的处理程序可能在 dispatch() 函数的上下文中执行时,则full memory fence已发行。

documentation注意使用内存屏障进行处理程序分配:

[...] The implementation will insert appropriate memory barriers to ensure correct memory visibility should allocation functions need to be called from different threads.

关于c++ - asio::io_service::post 是否使关系发生在发生之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com