在多线程的使用中,如果我们创建了多个线程,多个线程之间的执行顺序是由cpu来完成调度的,因此我们如果需要在多线程中进行数据共享和通信,就需要注意数据安全的问题,有可能我在一个线程中正在执行对数据的操作,此时cpu通过上下文切换,把当前线程切换掉了,开始执行了别的线程,而别的线程本来希望的是拿到我处理过后的数据,而现在拿到的数据是还没有处理完成的数据,这样当然就出现了数据传输的错误,这样的错误一般出现在读写操作,如果当前进程是只读的话,是不会影响数据安全的。为了避免这种我在操作中被切换中断的行为发生,就需要引入互斥量的概念,也就是我们常说的锁。
1,mutex
mutex是一个class,其中包含有成员函数,lock()、unlock()、try_lock(),
std::mutex mymutex;
通过上述语句就可以直接构造出一个互斥量对象,也就是构造出了一把锁,在创建时它是unlock状态,因此我们就可以去使用lock。我们在线程中使用lock()和unlock(),也就是说获取并锁上这把锁和打开这把锁并释放所有权,并在加锁和解锁的语句之间加入自己想要保护的代码段,这样在执行到当前代码段后,cpu就不会进行线程的切换任务。
mymutex.lock();//加锁
//....想要被保护的操作
mynutex.unlock();//解锁
需要注意的是,加锁解锁需要成对使用,加锁后一定就要完成锁的解锁,而且我前面说了lock是尝试获取这把锁并加锁,因此如果多个线程中只有一个线程可以获取到当前的锁,如果一个获取到了,另一个线程只有在锁被释放后才能继续尝试获取锁,并且lock和unlo