V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  A1st0n  ›  全部回复第 1 页 / 共 1 页
回复总数  2
使用条件变量:
```
#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;
}
```
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2799 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 11ms · UTC 15:05 · PVG 23:05 · LAX 07:05 · JFK 10:05
Developed with CodeLauncher
♥ Do have faith in what you're doing.