多线程,mutex

多线程,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() 等待时间点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值