gpt4 book ai didi

c++ - 将 std::mutex 用于由 boost::asio 管理的线程池

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:26:39 25 4
gpt4 key购买 nike

以某种方式跟进了 this question .我只是想知道在由 boost::asio:io_service 处理的函数中使用 std::mutex 是否可以?股的使用有点不切实际。根据我在 boost reference 中的发现我会说没关系。因为它指出

Asynchronous completion handlers will only be called from threads that are currently calling io_service::run().

所以boost创建的其他线程不应该干涉。我做对了吗?

最佳答案

正如其他人所指出的,std::mutex 和其他锁定机制可以在处理程序中使用。但是,两者之间存在根本区别:

  • 处理程序中的外部锁定机制用于保护资源免受竞争条件的影响。
  • strand 用于消除处理程序之间的争用,从而消除处理程序之间的竞争条件。

如果整个处理程序由于与其他处理程序的潜在竞争条件而不是线程池外部的线程而被同步,那么我想强调外部机制和 之间同步的细微差别之一boost::asio::strand.

考虑以下场景:

  • 2 个线程的线程池是使用 Boost.Asio 实现的。
  • 处理程序 AB 将在同一个互斥锁上同步。
  • 处理程序 C 不需要同步。
  • 处理程序 ABC 发布到 io_service

AB 被调用。由于两个线程都在使用,线程池现在由于外部同步而耗尽。不幸的是,其中一个线程在资源上被阻塞,导致不需要同步的处理程序(例如 C)坐在队列中。

如果在这种情况下使用链进行同步,则不会发生这种饥饿情况。 strand 维护自己的处理程序队列,并保证只有一个处理程序在 io_service 中,导致处理程序在被放入 io_service< 之前被同步。在场景中,如果 AB 被发布到 strand 中,那么 strand 将发布 A 进入 io_service。这将导致 ACio_service 中,允许 CB 时同时运行 保留在 strand 的队列中等待 A 完成。

此外,还有一些用例可以同时使用这两种形式的同步。例如,考虑资源与线程池外运行的线程共享的情况。线程池内部和外部的线程仍然需要互斥锁。但是,strand 可用于消除线程池内部线程之间互斥量的争用。

关于c++ - 将 std::mutex 用于由 boost::asio 管理的线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14310294/

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