我在测试类中有 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::A
遍地Test::D
循环并将它们绑定到 boost thread_pool,它在大多数情况下都可以正常工作。但是,有时 cout 语句会乱序打印。所以我可能会看到 ABCDABCDABCDAB D C
。据我了解,这与 thread_pool 何时获得新线程有关,我无法控制它们被调用的顺序。
我的问题是我需要按顺序调用 C() 和 D()(当需要调用它们时),并且不关心 A() 和 B() 相对于彼此和 C() 的顺序和D()。因此,我现在不是通过 thread_pool 调用 C 和 D,而是通过主进程调用它,保留所有互斥锁。当我尝试再次调用循环中的所有函数时,程序在 C 中的 cout 语句之前挂起。我很困惑为什么会这样。我可以在主进程和线程之间没有互斥锁吗?
尽管这些函数本质上很简单,但我无法将 C 和 D 的逻辑结合起来,因为这些函数最终会升级为基于事件的函数。一遍又一遍地调用它们的循环只是一个模拟现实生活事件的虚拟循环。D 总是在 C 之后被调用,但它可能会或可能不会被调用。
例如:
A B C D
ABCCD
广告
ABCCC