C++ 锁的作用

在研究vins-mono源代码时,读取IMU数据和特征数据时,遇到了c++锁,所以学习了下锁。

C++锁可分为互斥锁、读写锁(共享锁),递归锁;

std::mutex mutexx;//普通锁互斥锁 //包含在头文件<mutex>
std::recursive_mutex  recursive_mutexx; //递归锁 //包含在头文件<recursive_mutex >
std::shared_mutex shared_mutexx; //读写锁  //包含在头文件<shared_mutex>

互斥锁是为了避免数据竞争而产生的,即避免多个线程同时访问同一个数据。当某个线程加上互斥锁后,其他线程就阻塞等待该线程的锁解放后获取这个锁。以下列代码为例。

void helloguangzhou()
{
    int i = 10;
	while (i--) {
		cout << " hello guangzhou" << endl;
	}
}`
void hellowworld()
{
    int i = 10;
	while (i--)
	{
		cout << " hello world" << endl;
	}
}
int main()
{
	std::thread  t1(helloguangzhou);
	std::thread  t2(hellowworld);
	t1.detach();
	t2.detach();


	system("pause");
    return 0;
}

输出为图下所示,这看起来比较混乱。

 hello guangzhou hello world

 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello world
 hello world
 hello guangzhou
 hello world
 hello guangzhou
 hello world
 hello world
 hello guangzhou
 hello world
 hello world
 hello world
 hello world

如果两个线程函数分别加上锁,即

std::mutex mutexx;
void helloguangzhou()
{
    mutexx.lock();
    int i = 10;
	while (i--) {
		cout << " hello guangzhou" << endl;
	}
	mutexx.unlock();
}`
void hellowworld()
{
    mutexx.lock();
    int i = 10;
	while (i--)
	{
		cout << " hello world" << endl;
	}
	mutexx.unlock();
}

则它的输出为

 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello guangzhou
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world
 hello world

读写锁是为了在多个线程访问同一个数据时,只能有一个线程可以修改该数据,其他线程只能访问。
读写锁分为读模式和写模式两种,在读模式情况下,写模式线程被阻塞,其他读模式线程可以访问,即读模式共享;
在写模式情况写,读模式阻塞,其它写模式线程也阻塞,即写入唯一。这满足了读写锁只有一个线程可以修改数据,多个线程可以同时访问数据的条件。
写模式用lock(),unlock(),unique_lock等方法决定上锁和解锁,读模式用share_lock(),share_unlock(),shared_lock等方法决定上锁和解锁

https://blog.csdn.net/weixin_43448686/article/details/106572907

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack Ju

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值