使用 boost strand 和 std::mutex

Posted

技术标签:

【中文标题】使用 boost strand 和 std::mutex【英文标题】:Use boost strand and std::mutex 【发布时间】:2019-03-15 14:43:46 【问题描述】:

跟进这个site

文章HTTP Server 3

他们使用 stand保证这些处理程序都不会同时执行。

所以,我有 3 个线程调用 io_context.run() 并导致它们进入通道,并且可能必须同时使用向量的 push_back。

我是否必须使用 std::mutex 来锁定 push_back 函数以防止它们同时调用,或者它由 strand 很好地管理?

【问题讨论】:

考虑编辑您的问题以包含有问题的代码部分和更多解释,这样读者就不必自己找到所有这些信息 【参考方案1】:

假设您的所有代码都在 strand 中正确运行,那么一次只有一个线程会执行您的代码。

正在执行您的代码的线程将在三个可用线程之间切换,但一次只会执行一个函数。

因此,您不需要互斥锁,这是使用链的想法的一部分,因为互斥锁很难在异步代码中正确使用。

【讨论】:

我的意思是,当 async_read 从客户端和服务器处理其数据时,可能导致从运行 io_context.run 的多线程调用 push_back 两次(假设两个客户端在同一时间发送相同的数据包 ID) () 并且 strand 管理这个以防止调用两次? 是的,如果async_read 回调在同一个链中,它们将按顺序运行而不是同时运行。 那么当 async_read 只能在一个线程中调用时,在多线程中运行 io_context.run() 有什么意义呢? 如果你的整个程序中只有一个线程,那么在你的 io_context 中有多个线程是没有意义的。通常每个连接都有一个链 每个连接都有股线。恐怕许多客户端调用具有 push_back 的同一个句柄,这不是在多线程中调用的线程安全

以上是关于使用 boost strand 和 std::mutex的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost strand 和 std::mutex

boost::asio: “strand”类型的同步原语有啥名字吗?

boost::asio::strand 在 Ubuntu 11.04 (boost_all_dev 1.42) 上是不是损坏

Boost Asio总结class strand

strand 在 boost asio 中的优势是啥?

我需要在这个服务器模型中使用 boost::strand 吗?