我迷失在使用strand :: wrap和strand :: post的帖子之间的区别? 似乎既保证了序列化,又如何使用wrap进行序列化而不是获得一致的顺序? 似乎他们俩都必须做同样的事情。 我何时会使用一个而不是另一个?

这是一个更详细的伪代码:

    mystrand(ioservice);
    mystrand.post(myhandler1);
    mystrand.post(myhandler2);

这保证了我的两个处理程序即使在线程池中也按顺序被序列化和执行。

现在,这与下面有什么不同?

    ioservice->post(mystrand.wrap(myhandler1));
    ioservice->post(mystrand.wrap(myhandler2));

好像他们做同样的事情? 为什么用一个而不是另一个? 我看到两者都用过了,我试图弄清楚什么时候比另一个更有意义。

===============>>#1 票数:2

这条路

mystrand(ioservice);
mystrand.post(myhandler1);
mystrand.post(myhandler2);

myhandnd保证myhandler1在myhandler2之前执行

ioservice->post(mystrand.wrap(myhandler1));
ioservice->post(mystrand.wrap(myhandler2));

执行顺序是执行包装处理程序的顺序,io_service :: post不保证。

===============>>#2 票数:2

wrap创建一个可调用对象,当调用该对象时,将调用一个strand上的dispatch 如果你没有调用wrap返回的对象,那么根本不会发生任何事情。 因此,调用wrap的结果就像调用dispatch 现在与post相比如何? 根据文档, postdispatch post不同之处在于它不允许在调用post的相同上下文(堆栈帧)内立即调用传递的函数。

因此, wrappost有两种不同的方式:它们的动作的即时性,以及它们使用调用者自己的上下文来执行给定函数的能力。

我通过阅读文档得到了所有这些。

  ask by Oliver K translate from so

未解决问题?本站智能推荐:

2回复

boost :: asio :: io_service是否保留了处理程序的顺序?

boost::asio::io_service是否保证以与post()给出的顺序相同的顺序调用处理程序? 我在文档中找不到任何说法。 假设对io_service::post调用是序列化的。
2回复

使用Boost.Asio时,确保有效对象使用寿命的最佳方法是什么?

最近和Boost.Asio一起玩了很多。 我非常喜欢这个库,因为它提供了一种从当今的多核系统中挤出性能的绝佳方法。 我问自己几次的问题,我认为在与Asio进行异步调用时,有必要抛弃对象的生命周期/所有权。 我反复遇到的问题是,你经常需要“过期”一个仍然有异步回调的对象。 如果在调
2回复

何时在asio中使用异步操作

我应该何时在boost :: asio中使用异步操作而不是在单独的线程中使用同步操作?
1回复

使用未完成的完成处理程序重新启动tcp boost asio io_service

我编写了一个异步boost :: asio TCP应用程序,该应用程序使用声明为std::vector<std::thread> mIOServicePool 。 这些线程异步读取TCP数据并将其写入服务器。 以下代码取自GUI的启动按钮事件处理程序。 该代码是基于Qt的
2回复

boost :: asio socket async_ * strand

如何通过strand在socket上执行async_ *操作? 我看过Timer.5(Boost / Asio示例),但它们只展示了如何调用用户的处理程序。 当我在多线程应用程序中将async_write插入套接字时,可能会写入损坏的数据。 并且一个strand保证这些处理程序不会同时执行
2回复

asio :: async_write和strand

此代码是否保证async_write中的所有异步操作处理程序(对async_write_some的调用)都是通过strand调用的? (或者只是为了my_handler ?)
2回复

boost :: asio:“strand”类型的同步原语是否有任何名称?

boost :: asio库提供了一个有趣的同步模型,使用“strands”来序列化对通常需要锁定的资源的访问。 这通过将每个锁操作基本上转换为入队来增加并行性。 搜索“strands”只会产生关于asio的相关结果,即使它们看起来像是一个非常有用的多线程原语。 我还缺少一些其他的术语
1回复

在boost :: asio中,为什么异步接受处理程序需要重启异步接受?

在boost :: asio(异步TCP服务器)的Daytime.3教程中,类tcp_server包含以下两种方法: 我担心的是标有***的线。 如果此操作需要很长时间才能完成,该怎么办? 即使没有, ***行和start_accept调用之间也必须有一些时间间隔,在此期间服务器将无
2回复

使用boost :: asio :: async_wait_until和boost :: asio :: streambuf

我有一个当前正在开发的应用程序,用于使用串行通信与设备进行通信。 为此,我使用了增强库basic_serial_port。 现在,我只是尝试从设备读取数据,并且正在使用async_wait_until函数,再加上deadline_timer async_wait类中的async_wait 。
2回复

我什么时候必须使用boost :: asio:strand

阅读boost :: asio的文档,尚不清楚何时需要使用asio :: strand。 假设我有一个使用io_service的线程,那么可以安全地在套接字上进行如下编写吗? 在多个线程调用Connection :: write(..)的地方,还是我必须使用asio :: strand