假设有个类的两个成员函数,需要在不同的线程里执行,这两个成员函数需要写入同一个文件,因此需要使用 mutex 确保这两个函数不会同时写,代码类似这样
class Widget{
public:
void funA();
void funnB();
private:
std::mutex mutex;
};
void Widget::funA(){
{
std::unique_lock(mutex);
//operate A;
}
}
void Widget::funB(){
{
std::unique_lock(mutex);
//operate B;
}
}
然后设计两个函数来封装这两个成员函数,类似
void execA(Widget* w){
w->funcA();
};
最后程序里,生成一个 Widget 的对象,需要在两个线程里执行这两个函数,即
Widget* w{};
std::jthread threadA(execA, &w); //在一个线程里执行 A 函数
std::jthread threadB(execB, &w); //在另一个线程里执行 B 函数
在这种情况下,大多数式成员函数 funcA()先执行,但多次尝试后,有几次式 funcB()先获得 mutex 。
在下列三个前置条件下
- 使用 c++20 标准,并可以使用 vs2022 最新版支持的 c++23 标准
- 不该用 std::thread
- 不使用 std::this_thread::sleep_for()对 B 进行睡眠
我向问下,有没有办法确保 A 一定在 B 之前获得 mutex ?