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

跟进这个site

文章HTTP Server 3

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

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

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

【问题讨论】:

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

标签: c++ c++11 boost boost-asio


【解决方案1】:

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

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

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

【讨论】:

  • 我的意思是,当 async_read 从客户端和服务器处理其数据时,可能导致从运行 io_context.run 的多线程调用 push_back 两次(假设两个客户端在同一时间发送相同的数据包 ID) () 并且 strand 管理这个以防止调用两次?
  • 是的,如果async_read 回调在同一个链中,它们将按顺序运行而不是同时运行。
  • 那么当 async_read 只能在一个线程中调用时,在多线程中运行 io_context.run() 有什么意义呢?
  • 如果你的整个程序中只有一个线程,那么在你的 io_context 中有多个线程是没有意义的。通常每个连接都有一个链
  • 每个连接都有股线。恐怕许多客户端调用具有 push_back 的同一个句柄,这不是在多线程中调用的线程安全
猜你喜欢
  • 2021-11-22
  • 2012-11-02
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2011-12-15
  • 2017-03-28
相关资源
最近更新 更多