请教一个多线程加锁问题!

StarDnaFox 2021-03-25 09:05:24
请教这两个例子在使用中有区别吗?请详细指导一下,在下初学锁。
例子1:

std::mutex 锁1;

static int i = 0;

线程1:

std::lock_guard<std::mutex> lk(锁1);
i = i + 1;


线程2:

std::lock_guard<std::mutex> lk(锁1);
i = i + 1;


例子2:
std::mutex 锁1;
std::mutex 锁2;
static int i = 0;

线程1:

std::lock_guard<std::mutex> lk(锁1);
i = i + 1;


线程2:

std::lock_guard<std::mutex> lk(锁2); //这里是锁2
i = i + 1;

...全文
286 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
例子1是对的,例子2没作用。 首先你有这个疑问是因为你还没有特别明白你设定的锁是做什么的。 别急,没错。 你设定锁得目的是为了锁住i,这个变量。 不是为了锁而锁。 既然是为了锁住i,这个变量,那么1个锁就足够了。
SleekStone 2021-03-25
  • 打赏
  • 举报
回复
当然有区别了,例子一相当于现在有一个房间,房间里有个妹纸..额不 ..有个i,然后房间只有一个门,这个门有一把锁,外边的人想进去看妹纸...看i,只能拿到钥匙才能进去,也就是说只有等别人看过了之后出来拿到钥匙才能进去看。第二个例子相当于这个房间有两个门,两个门各有一把钥匙,所以至少有两个人是可以同时通过两个门进去看妹纸..看i的,他们会打架...
赵4老师 2021-03-25
  • 打赏
  • 举报
回复
例子1是对的。 例子2等于没加锁。
StarDnaFox 2021-03-25
  • 打赏
  • 举报
回复
也就是,例子1的两个线程用了同一把锁1,例子2的两个线程分别用了不同的锁1和锁2,这两种用法哪个是对的?或者两个都对,但是有区别吗?请老师指点迷津,非常感谢!
困了就喝白茶 2021-03-25
  • 打赏
  • 举报
回复
关照我,看我的博客
flying_music 2021-03-25
  • 打赏
  • 举报
回复
额,这问题确实挺基础的,哈哈 你先了解一下多线程为什么要加锁吧,加锁是为了锁定一个全局资源,一个线程访问这个资源时,另一个线程必须等待 你例子2相当于把两个锁串起来了,开任意一个锁就能访问i,所以是不行的

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧