52.C++线程同步_锁
约 454 字大约 2 分钟
mutex 加锁解锁
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex mtx; // 互斥锁
void worker(int id) {
std::cout << "线程 " << id << " 尝试获取锁...\n";
mtx.lock(); // 手动加锁
std::cout << "线程 " << id << " 获取了锁,正在工作...\n";
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
std::cout << "线程 " << id << " 任务完成,释放锁。\n";
mtx.unlock(); // 手动解锁
std::cout << "线程 " << id << " 退出。\n";
}
int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join();
t2.join();
return 0;
}
lock_guard 加锁自动解锁( lock_guard 生命周期结束自动解锁)
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex mtx; // 互斥锁
int sharedData = 0; // 共享数据
// 写线程(生产者)
void writeData() {
for (int i = 1; i <= 5; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟处理延迟
std::lock_guard<std::mutex> lock(mtx); // 加锁,自动解锁
sharedData = i;
std::cout << "Writer: 写入数据 " << i << std::endl;
}
}
// 读线程(消费者)
void readData() {
for (int i = 1; i <= 5; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(700)); // 模拟处理延迟
std::lock_guard<std::mutex> lock(mtx); // 加锁,自动解锁
std::cout << "Reader: 读取数据 " << sharedData << std::endl;
}
}
int main() {
std::thread writer(writeData);
std::thread reader(readData);
writer.join();
reader.join();
return 0;
}
unique_lock 加锁后需要手动解锁
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex mtx; // 互斥锁
void worker(int id) {
std::cout << "线程 " << id << " 尝试获取锁...\n";
std::unique_lock<std::mutex> lock(mtx); // 获取锁
std::cout << "线程 " << id << " 获取了锁,正在工作...\n";
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
lock.unlock(); // 手动解锁
std::cout << "线程 " << id << " 手动释放了锁。\n";
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟其他操作
lock.lock(); // 重新加锁
std::cout << "线程 " << id << " 重新获取锁,执行额外操作。\n";
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "线程 " << id << " 任务完成。\n";
}
int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join();
t2.join();
return 0;
}