通过数数1-100 来感受std::unique_lockstd::mutex的作用
如果没有std::unique_lockstd::mutex,各个线程对num的++是乱的,不能保证正确的顺序,可能存在同时对num进行添加
使用了std::unique_lockstd::mutex 保存使用num的时候,只有一个线程在使用,当释放了锁以后,其他的线程才可以使用
使用方法注释 std::unique_lockstd::mutex lock(mtx); 这一句,来感受lock的作用
#include <mutex>
#include <thread>
#include <iostream>
#include <string>
/// <summary>
/// 通过数数来感受std::unique_lock<std::mutex>的作用
/// 如果没有std::unique_lock<std::mutex>,数据各个线程对num的使用是乱的,不能保证正确的顺序,可能存在同时对num进行添加
/// 使用了std::unique_lock<std::mutex> 保存使用num的时候,只有一个线程在使用,当释放了锁以后,其他的线程才可以使用
/// </summary>
class TestMutex
{
public:
void increment(int times, int theadNo) {
for (int i = 0; i < times; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 锁定互斥锁
++num; // 保护共享资源
// lock 会在离开作用域时自动解锁
std::cout << std::to_string(theadNo) << " num:" << num << "\n";
std::this_thread::sleep_for(std::chrono::microseconds(500));
}
}
void TestPrintThreadId()
{
const int increment_times = 50;
std::thread thread[2];
for (size_t i = 0; i < 2; i++)
{
thread[i] = std::thread(&TestMutex::increment, this, increment_times, i);
}
for (auto& c : thread)
{
c.join();
}
}
private:
std::mutex mtx;
int num = 0;
};
标签:std,include,lock,num,线程,unique,硬核
From: https://www.cnblogs.com/tlink/p/18586875