C++ thread学习三 (使用互斥量mutex处理共享数据)

本文探讨了在多线程环境下,当线程A读取、线程B写入同一内存数据时可能出现的问题。为解决这个问题,文章通过实例介绍了如何使用C++的互斥量mutex来确保对共享数据的线程安全访问。示例中,一个线程向list添加数据,而另一个线程从中读取数据,展示了mutex在防止数据竞争中的作用。
摘要由CSDN通过智能技术生成

前面我们每个线程只是各自处理各自的数据,或者对于共享数据多个线程只有读操作,并没有写操作,因此不存在任何问题。但是如果线程A,B对同一块内存进行操作,线程A读数据,线程B写数据,如果A读数据前想要的数据还没来得及读,由于cpu时间片切换,B往内存里写了个新数据覆盖掉原来的数据,那么就会出现错误。

为了解决这个问题,最简单的办法就是给这块共享内存加上锁,一次只允许一个线程对这块内存进行操作。

为了模拟这个问题,创建一个list,其中一个线程不断往这个list里添加数据,另一个线程从该list里读取数据,代码如下:

//
//  main.cpp
//  mutex
//  测试学习mutex使用,创建一个共享list,一个线程往此list里写数据,一个线程从此list里读数据。
//  方法一:使用mutex.lock()以及mutex.unlock(),lock()以及unlock()要成对使用
//  方法二:使用lock_guard创建类对象,对象的构造函数中调用lock函数,{}为这个对象的作用域,过了这个作用域该对象被析构,在析构函数中unlock被调用,这样就避免了忘记手动调用unlock的问题。
//  三:如果一次性给多个mutex上锁,可以使用std::lock(mutex1, mytex2, ...),这样如果其中某一个mutex加锁失败,其余mutex会被自动释放,这样就避免了死锁问题,所有mutex要么全部被锁上,要么全部未被锁上。解锁仍然对调用每一个mutex的unlock函数。
//  Created by Chaochun Ma on 6/18/2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值