请帮助我检查我对std::unique_lock
移动语义的理解是否正确。
假设我有一个函数myFunc
,该函数需要在执行开始时获取互斥体。
此函数是从不同的函数调用的,其中一些函数例如myWrapper1
在调用myFunc
之前保持相同的互斥锁。
有时我需要在myFunc
的作用域退出时不释放此锁。
typedef std::unique_lock<std::mutex> MyLock;
class Example2
{
std::mutex m_data_mutex;
MyLock&& myFunc(MyLock&& lk)
{
bool was_lock = lk.owns_lock();
if( !was_lock ) lk.lock();
std::cout << "myFunc" << std::endl;
if( !was_lock ) lk.unlock();
return std::move(lk);
}
void myWrapper1()
{
MyLock lk(m_data_mutex);
std::cout << "1" << std::endl;
lk = myFunc(std::move(lk));
std::cout << "2" << std::endl;
}
void myWrapper2()
{
MyLock lk(m_data_mutex);
std::cout << "1" << std::endl;
lk.unlock();
lk = myFunc(std::move(lk));
std::cout << "2" << std::endl;
lk.lock();
std::cout << "3" << std::endl;
}
};
问题是:
- 对于
myWrapper1
,可以保证MyLock
仅在myWrapper1
范围的末尾才发布,不是吗? - 我是否为此问题使用了正确的习惯用法?