#include <iostream>
#include <mutex>
#include <thread>
int sum = 0;
// lock_guard
void thread_func(int num) {
static std::mutex mutex;
// 利用对象的生命周期结束时会被销毁,代码是异常安全的,无论函数正常返回、还是在中途抛出异常,
// 都会引发堆栈回退,也就自动调用了 unlock()。
std::lock_guard<std::mutex> lock(mutex);
sum += num;
std::cout << num << "," << sum << std::endl;
}
void Test() {
for (int i = 0; i < 10; i++) {
std::thread thread(thread_func, i);
thread.join();
}
}
/*
std::unique_lock 则是相对于 std::lock_guard 出现的,std::unique_lock 更加灵活,
std::unique_lock 的对象会以独占所有权(没有其他的 unique_lock 对象同时拥有某个
mutex 对象的所有权)的方式管理 mutex 对象上的上锁和解锁的操作
std::lock_guard 不能显式的调用 lock 和 unlock,而 std::unique_lock
可以在声明后的任意位 置调用,可以缩小锁的作用范围,提供更高的并发度
*/
void thread_func1(int num) {
static std::mutex mutex;
std::unique_lock<std::mutex> lock(mutex);
sum += num;
// 显示进行手动unlock
lock.unlock();
std::cout << num << "," << sum << std::endl;
}
void Test1() {
for (int i = 0; i < 10; i++) {
std::thread thread(thread_func1, i);
thread.join();
}
}
int main() {
Test1();
return 0;
}
C++ 新特性mutex封装
最新推荐文章于 2025-01-21 13:28:02 发布