一、概论
线程包括了同步以及异步,同步和异步之间的区别就在于共享数据的竞争读取。
二、线程同步
创建线程(以及线程开始运行的时候)——>join(指定线程的模式)
代码链接:https://github.com/xinhui1111/leetcode/blob/master/src/test.cpp
线程与锁的总结
多线程的问题主要是解决竞争资源的问题,关键看那些变量是竞争资源,需要进行处理(其实也就是锁)。
一般的多线程就是锁和释放锁的情况。
std::mutex mtx;
mtk.lock();
需要锁住的竞争资源
mtx.unlock();
但是这种形式就需要记住在何时去释放锁,因为如果一直锁住就影响整个程序的效率,甚至是会导致程序不能运行。
为了完善这种方式,就想到可以利用类的构造与析构函数,在类的生命周期结束了之后就会调用其析构函数,这时候调用锁的释放,就能够自动完成对锁的lock以及unlock。
,所以为了解决这种问题,就提出可以用类封装一个锁mutex
class lock_guard{
public:
lock_guard(){
//新建mutex并加锁_mutex.lock()
}
~lock_guard(){
//释放锁_mutex.unlock()
}
private mutex _mutex;
};
所以针对这种方式,我们要考虑的就是lock_guard所对应的对象,两种创建方式并不重要,习惯用哪种就用哪种:
- 都要首先定义互斥量mutex m_mutex;
- lock_guard mylockguard(m_mutex, adopt_lock);//adopt_lock:用于使作用域锁定取得锁定互斥的所有权的标记,一个循环周期就会结束
- lock_guard mylockguard(m_mutex)
可以通过一个{}来进行控制变量,也可以通过while以及if中的{},那么互斥量的作用就在这个{}
的声明周期里