unique_lock<std::mutex> lk(m_a);
对象在超出作用域时,会调用析构函数,析构函数会将对象持有的互斥锁解锁,所以即使不主动解锁,超出作用域后 lk(m_a)也会被析构函数解锁。
下面是VS2019中mutex头文件中对~unique_lock()的定义
private:
_Mutex* _Pmtx;
bool _Owns;
unique_lock() noexcept {
if (_Owns) {
_Pmtx->unlock();
}
}
如果是调用的POSIX互斥锁,则在加锁后必须解锁。