首页
注册
登录
A1st0n 最近的时间轴更新
A1st0n
V2EX 第 537684 号会员,加入于 2021-03-15 20:56:28 +08:00
A1st0n
提问
技术话题
好玩
工作信息
交易信息
城市相关
CLion 界面字体大小调节问题
C++
•
A1st0n
•
12 天前
• 最后回复来自
Cjkemr
1
»
A1st0n 创建的更多主题
A1st0n 最近回复了
1 天前
回复了
LuckyPocketWatch
创建的主题
›
C++
›
如何保证一个成员函数在另一个成员函数之前获得 mutex?
使用条件变量:
```
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <chrono>
class Widget {
public:
void funcA() {
std::unique_lock lock(mutex_);
std::cout << "funcA starts\n";
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟操作
std::cout << "funcA ends\n";
// 标记 A 已完成,通知等待的线程
funcA_done_ = true;
cv_.notify_one();
}
void funcB() {
// 等待 funcA 完成
std::unique_lock lock(cv_mutex_);
cv_.wait(lock, [this] { return funcA_done_; });
std::unique_lock file_lock(mutex_);
std::cout << "funcB starts\n";
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟操作
std::cout << "funcB ends\n";
}
private:
std::mutex mutex_; // 用于文件操作的互斥锁
std::mutex cv_mutex_; // 用于条件变量的互斥锁
std::condition_variable cv_; // 条件变量
bool funcA_done_ = false; // 标志 funcA 是否已完成
};
// 封装函数
void execA(Widget* w) {
w->funcA();
}
void execB(Widget* w) {
w->funcB();
}
int main() {
Widget w;
// 使用 std::jthread
std::jthread threadA(execA, &w); // 在一个线程里执行 A 函数
std::jthread threadB(execB, &w); // 在另一个线程里执行 B 函数
return 0;
}
```
»
A1st0n 创建的更多回复
关于
·
帮助文档
·
博客
·
API
·
FAQ
·
实用小工具
·
4994 人在线
最高记录 6679
·
Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms ·
UTC 09:39
·
PVG 17:39
·
LAX 01:39
·
JFK 04:39
Developed with
CodeLauncher
♥ Do have faith in what you're doing.