gpt4 book ai didi

c++ - 在线程池和进程之间 boost 互斥量

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:16 24 4
gpt4 key购买 nike

我在类测试中有 4 个函数:

void Test::A()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "A!" << endl;
}

void Test::B()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "B!" << endl;
}

void Test::C()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "C!" << endl;
}

void Test::D()
{
boost::lock_guard<boost::mutex> lock(mutex);
cout << "D!" << endl;
}

如果我按字母顺序调用 Test::ATest::D,在一个循环中一遍又一遍地将它们绑定(bind)到一个 boost thread_pool,它工作正常大多数情况下。然而,有时,cout 语句会乱序打印。所以我可能会看到 A B C D A B C D A B C D A B D C。据我了解,它只与 thread_pool 何时获得新线程有关,我无法控制它们被调用的顺序。

我的问题是我需要按顺序调用 C() 和 D()(当需要调用它们时),而不关心 A() 和 B() 相对于彼此和 C 的顺序() 和 D()。因此,我现在不是通过 thread_pool 调用 C 和 D,而是通过主进程调用它,保留所有互斥量。当我尝试再次循环调用所有函数时,程序在 C 中的 cout 语句之前挂起。我很困惑为什么会这样。我不能在主进程及其线程之间使用互斥量吗?

尽管这些函数本质上很简单,但我无法将 C 和 D 的逻辑结合起来,因为这些函数最终将升级为基于事件的函数。循环一遍又一遍地调用它们只是一个模拟现实生活事件的虚拟循环。 D 总是在 C 之后被调用,但它可能会被调用,也可能不会被调用。

例如:

A B C D

A B C C D

A D

A B C C C

最佳答案

如果 C 和 D 可以由单独的事件触发(即你不能在同一个线程中按顺序调用它们),但 D 不能在 C 之前执行,你需要使用条件变量或其他一些同步方式(可能是信号量)。

由于您已经在使用 boost,我建议您查看 Boost Condition Variables

关于c++ - 在线程池和进程之间 boost 互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18209985/

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