C++多线程
线程:
async和thread
锁:
C++11中的std::atomic和std::mutex
推荐文章:
C++11 多线程(std::thread)详解_c++11线程使用-CSDN博客
c++ 标准库多线程 - 云山漫卷 - 博客园
std::lock_guard
是一个 RAII 风格的简单的锁管理器,它在构造时自动加锁,在析构时自动解锁。
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
std::mutex mtx;
void printNumber(int num) {
std::lock_guard<std::mutex> lock(mtx); // 自动加锁和解锁
std::cout << "Number: " << num << "\\\\n";
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(printNumber, i);
}
for (auto& t : threads) {
t.join();
}
return 0;
}
条件变量(std::condition_variable
)用于线程间的同步,允许一个线程等待另一个线程满足某些条件。
配合std::condition_variable::wait()
函数的第一个参数的必须是比lock_guard更灵活控制也更复杂重度的锁:std::unique_lock。它可以RAII自动析构,也可以手动lock/unlock,中间有的代码段就可以释放锁。手动把它unlock之后只是解锁,没有销毁,后续可以按需复用再次 lock/unlock。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
bool ready = false; // 共享状态标志
// 工作线程函数
void printMessage() {
std::unique_lock<std::mutex> lock(mtx); // 获取互斥锁
cv.wait(lock, []{ return ready; }); // 等待条件满足(避免虚假唤醒)
// 此处执行需要同步的操作(当ready为true时)
std::cout << "Message printed after condition met\n";
// lock会自动释放(unique_lock析构时)
}
int main() {
std::thread t(printMessage); // 创建并启动线程
{
std::lock_guard<std::mutex> lock(mtx); // 自动加锁
ready = true; // 修改共享状态
// lock在此作用域结束自动释放
}
cv.notify_one(); // 通知一个等待线程
t.join(); // 等待线程结束
return 0;
}