unique_lock用来配合condition_variable,即帮忙控制C++中多线程的管理。打个例子,时间为水,进程是个大箱子,里面有许多水桶,一个小水桶是一个线程,水流进大箱子,unique就是水龙头,而condition_variable是导管,mutex是控制导管和水龙头的自动化装置,导管一侧的水量到达一定时,mutex控制水龙头关上水,导管偏移刷新,mutex再控制水龙头开水,一直到预想的输出结果,水龙头这次旅程永远关闭,销毁后无法再开启。
我见许多多线程使用unique_lock的操作如下
mutex m;
unique_lock<mutex>lk(m);
找了源代码,这是锁的操作。
void lock()
{ // lock the mutex
unique_lock<mutex> _Lock(_My_mutex);
while (_My_locked != 0)
_My_cond.wait(_Lock);
_My_locked = UINT_MAX;
}
找了其中的定义,即用了cond.wait()的操作,之后用condition_variable类中的notify_all()或notify_one操作唤醒。
private:
mutex _My_mutex;
condition_variable _My_cond;
unsigned int _My_locked;
之后从unlock的操作中也找到了condition_variable中的操作,使用的是notify_one的操作。
void unlock()
{ // unlock the mutex
{
// The lock here is necessary
lock_guard<mutex> _Lock(_My_mutex);
_My_locked = 0;
}
_My_cond.notify_one();
}
这里就简单的介绍了unqiue_lock中lock与unlock的操作。