进程和线程的概念:
1、进程是一个正在执行的程序,是向CPU申请资源的,不同进程之间数据是相互独立的,而一个进程至少有一个线程。
2、线程是最小的控制单元,是进程中单一的顺序控制流程,是进程中的执行单元。
关于线程中的互斥锁:
方式一:
Mutex mut;
一旦上锁,即调用mut.lock()函数,只有在解锁之后才能用,即调用mut.unlock()函数。
方式二:
unique_lock<mutex>locker1(m_mutex, defer_lock);
defer_lock表示不对mutex加锁,只是管理mutex,此时mutex是没有加锁的状态!
方式三:
lock_guard<mutex>guard(mut);
调用lock_guard就是表示上锁,而且不需要自己解锁,会在程序执行结束时,通过lock_guard的析构函数解锁!
方式二和方式三的比较:
1.lock_guard无法被复制(=)和移动(move);
而unique_lock可以被移动,此时mutex会被转移,原先的 将失效(unique_lock<mutex> lokcer = move(locker1));
2.unique_lock消耗更多的性能,但更有弹性,更加占用空间,速度慢,因为其需要维护其中的mutex;
lock_guard性能更优。
死锁的产生:多个线程申请资源时,发生相互等待的情况。
避免产生死锁的方法:
1、尽量只是用单个锁;
2、使用多个锁时保证上锁顺序一致;
3、使用lock自动管理互斥锁;
使用lock:
Lock(m_mutex1, m_mutex2);
Lock_guard<mutex> guard1(m_mutex1, adopt_lock);
Lock_guard<mutex> guard2(m_mutex2, adopt_lock);
(参数adopt_lock表示不上锁,只是状态)