前面使用过lock_guard来对线程进行了管理,lock_guard对线程管理的特点是,从声明lock_guard开始,到lock_guard作用域结束,lock_guard参数里的线程一直会被锁住,如果在lock_guard析构之前,std::mutex对象被unlock了,那么lock_guard解锁时就会出现空指针等错误。std::unique_lock与他不同,可以在unique_lock范围内对std::mutex对象进行unlock,unique_lock提供的弹性不止如此。
例如,添加std::defer_lock参数,加了std::defer_lock这个参数之后,告诉locker,mutex对象并没有被锁住,然后可以为指定代码加锁和解锁,如下:
std::unique_lock<std::mutex> locker(m_mutex,std::defer_lock);
locker.lock();
std::cout<<"from:"<<id<<"value:"<<value<<std::endl;
locker.unlock();
需要注意的是,不管是lock_guard还是unique_lock,他们都不能被复制,unique_lock可以被移动,lock_guard不可以被移动,当我们移动unique_lock时,mutex对象的控制权,也从一个unique_lock转移到另一个unique_lock。
std::unique_lock<std::mutex> lo