引自C++ 多线程 互斥量(mutex)与锁(lock)_mutex 上下文切换-CSDN博客
一、基本概念
在多线程环境中,有多个线程竞争同一个公共资源,就很容易引发线程安全的问题。因此就需要引入锁的机制,来保证任意时候只有一个线程在访问公共资源。
互斥量就是个类对象,可以理解为一把锁,多个线程尝试用lock()成员函数来加锁,只有一个线程能锁定成功,如果没有锁成功,那么流程将卡在lock()这里不断尝试去锁定。
互斥量使用要小心,保护数据不多也不少,少了达不到效果,多了影响效率。
二、使用方法
包含头文件#include <mutex>
2.1 mutex.lock(),unlock()
步骤:1.lock(),2.操作共享数据,3.unlock()。
lock()和unlock()要成对使用,不能重复上锁和解锁。本质就是lock~unlock之间的程序(数据)不会同时调用、修改。
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;list<int> test_list;mutex my_mutex;
void in_list(){for(int num=0;num<1000000000000000000;num++){my_mutex.lock();cout<<"插入数据: "<<num<<endl;test_list.push_back(num);my_mutex.unlock();}}void out_list(){for(int num=0;num<1000000000000000000; ++num){my_mutex.lock();if(!test_list.empty()){int tmp = test_list.front();test_list.pop_front();cout<<"取出数据:"<<tmp<<endl;}my_mutex.unlock();}
}
int main()
{thread in_thread(in_list);thread out_thread(out_list);in_thread.join();out_thread.join();cout << "Hello World!" << endl;return 0;
}