前面我们每个线程只是各自处理各自的数据,或者对于共享数据多个线程只有读操作,并没有写操作,因此不存在任何问题。但是如果线程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