gpt4 book ai didi

C++。 std::condition_variable 和多个等待线程

转载 作者:行者123 更新时间:2023-12-01 14:47:11 25 4
gpt4 key购买 nike

我有课,用 queuestd::function<void()>成员和方法 PushPop .
我要实现加法PushAndWaitUntilExecuted .当你有一个时很容易consumer-thread (谁调用 Pop )和一个 producer-thread (谁调用 Push) - 很简单 std::condition_variable就足够了。
但是我的应用程序具有动态数量的线程,可以通过调用 PushAndWaitUntilExecuted 执行相同的代码行并行运行并等待 consumer-thread执行推std::function目的。
一个有想法的路过std::pair<uint64_t, std::function<void()>>queue而不仅仅是 std::function<void()> ,其中 uint64_t - producer-thread ID ( boost::this_thread::get_id() )。然后consumer-thread调用 std::condition_variable::notify_all()并且所有线程将检查是否执行 std::function有相同的ID带线与否。
是否可以解决或可以实现更好的解决方案?

最佳答案

这里需要引入的不仅仅是一个条件变量,以避免几种不同的竞争条件。还需要互斥锁和作业完成标志。
此时,更换您的 std::function<void()> 变得更干净了。有一个包含这个闭包的小类,以及所有额外的行李:

struct job {
std::function<void()> implementation;
std::mutex m;
std::condition_variable flag;
bool completed=false;
};
您的队列变成了 std::shared_ptr<job> 的队列s,而不是 std::function 的队列s,在动态范围内构造作业(因为,当然,互斥体和条件变量不可复制或移动,并且这些对象可以从您的两个线程访问)。
在您的工作线程完成执行后,它:
  • 锁定互斥锁。
  • completed为真
  • 表示条件变量。

  • 还有您的 PushAndWaitUntilExecuted , 执行推送后:
  • 锁定互斥锁
  • 等待条件变量,直到 completed已设置

  • 您必须彻底了解 C++ 绝对不会给您任何保证,即在您将新的闭包插入作业队列后,某些线程不会在原始线程(即插入它)开始查看条件变量。到现在为止,没有人会再向条件变量发出信号。如果您在这里只需要处理一个条件变量,那么您将等待条件变量发出信号,直到我们的太阳爆炸。
    这就是为什么您需要的不仅仅是一个条件变量、一个互斥体和一个显式标志,并使用上述方法来正确处理线程间排序。
    这是一种相当经典的常规方法。您应该在关于此主题的每本优秀的 C++ 教科书中找到许多类似实现的示例。

    关于C++。 std::condition_variable 和多个等待线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63207012/

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