C++用std::thread实现线程交互是否可行,是否需改用std::async?
问题解答
现有代码问题
std::unique_lock使用错误:默认构造std::unique_lock<std::mutex>时会自动对传入的互斥量加锁,后续手动调用lock()会造成重复加锁,触发未定义行为。要么构造时传入std::defer_lock参数标记不自动加锁,要么删除手动lock()、unlock()调用,靠unique_lock的RAII机制自动管理锁生命周期即可。- 存在严重数据竞争:
func1中解锁互斥量后,才执行myvector.size()判断、元素读取、clear()操作,这部分操作完全没有锁保护,此时t2可能同时修改myvector,属于典型的跨线程读写冲突,会触发未定义行为。之前拷贝的临时变量temp完全没有被使用,没有起到任何隔离作用。 - 忙等待浪费资源:两个线程死循环不停抢锁,会导致CPU占用率异常升高,性能损耗极大。
需求实现可行性
修正上述问题后,仅用std::thread就可以完全实现你的需求,不需要强行改用std::async、std::future组件:
- 你的场景是两个长期并行运行的常驻线程,
std::thread本身就是最适配的选型,不需要额外封装。 std::async更适合单次异步任务、需要获取任务返回值的场景,对于持续运行、反复传递数据的多线程交互场景,用共享变量+互斥量+条件变量的组合是更合理的选择,不需要额外引入future机制。
优化实现建议
可以按以下逻辑修改代码:
- 修正互斥锁用法,所有对
myvector的读写操作全部放在锁保护区间内 - 新增
std::condition_variable减少忙等待,t2写入数据后通知t1处理,t1无数据时进入阻塞状态,不占用CPU资源 - 可设置退出条件,避免线程死循环无法正常退出
修正后的核心代码示例:
#include <vector> #include <thread> #include <mutex> #include <condition_variable> std::vector<int> myvector; std::mutex mu; std::condition_variable cv; int result; bool exit_flag = false; void samplefunc(int a, int& result){ result = 2 * a; } void func1(){ while(!exit_flag){ std::unique_lock locker(mu); // 等待直到有数据或者退出信号 cv.wait(locker, []{ return !myvector.empty() || exit_flag; }); if (exit_flag) break; int val = myvector.at(0); myvector.clear(); locker.unlock(); // 解锁后再执行业务逻辑,减少锁持有时间 samplefunc(val, result); } } void func2(){ while(!exit_flag){ // 复杂逻辑计算得到dummy int dummy = 0; std::unique_lock locker(mu); myvector.push_back(dummy); locker.unlock(); cv.notify_one(); // 可按需加sleep模拟实际业务耗时 } } int main(){ std::thread t1(func1); std::thread t2(func2); // 运行一段时间后设置exit_flag = true通知线程退出 // 此处省略退出触发逻辑 t1.join(); t2.join(); }
内容的提问来源于stack exchange,提问作者eet
相关产品推荐
相关产品推荐

