多线程,mutex
#include<iostream>
#include<thread> //头文件
using namespace std;
int date = 0;
void dun(){
for(int i=0;i<100000;i++){
date++;
}
}
int main(){
thread t(foo); //定义
t.join(); //启动
return 0;
}
多线程出现的问题—>资源竞争
#include<iostream>
#include<thread>
using namespace std;
int date = 0;
void dun(){
for(int i=0;i<100000;i++){
date++;
}
}
int main(){
thread t(foo);
for(int i=0;i<100000;i++){
date++;
}
t.join();
cout<<date; //结果不是200000
return 0;
}
原因
线程t或者主线程在调用date的时候,可能出现,写后读的情况,导致丢失写的操作。
解决办法‘
- 内部锁
#include<iostream>
#include<thread>
using namespace std;
int date = 0;
void dun(){
for(int i=0;i<100000;i++){
//date++;
//使用这个可以使date++变成原子操作
InterlockedAdd((LONG*)&date,1);
}
}
int main(){
thread t(foo);
for(int i=0;i<100000;i++){
//date++;
InterlockedAdd((LONG*)&date,1);
}
t.join();
cout<<date; //结果不是200000
return 0;
}
- 临界区
CRITCAL_SECTION cs;
EnterCriticalSection(&cs); //上锁
LeaveCriticalSection(&cs); //解锁
---- 利用函数的构造和析构自动的上锁
- mutex锁
#include<mutex>
mutex m_mytx;
//lock_guard<std::mutex> lg(m_mytex);
m_mytex.lock();
m_mytex.unlock();
死锁
线程A;
获取锁1,等待锁2
线程B:
获取锁2,等待锁1
解决方法
- 切换使用锁的顺序
线程A;
获取锁1,等待锁2
线程B:
获取锁1,等待锁2
mutex,互斥量
- 同一个线程是不能重复进入mutex(上锁)
recursive_mutex,递归互斥量
- 同一线程允许重复进入,但注意释放问题,进入几次,就要释放几次
- 效率低
- 有上限
timed_mutex,超时互斥量
- 提供了等待超市机制
- 1 > try_lock() 避免了堵塞,获取不到锁就返回false
- 2 > try_lock_for(chrono) 等待时间
- 3 > try_lock_until() 等待时间点