我有一些函数,试图锁定std::mutex
,如果成功锁定,则该函数创建具有lambda函数作为线程函数参数的std::thread
,并且还使用std::move()
传递锁:
static std::mutex mtx;
// some mutex defended stuff
void someFunc() {
// try lock mutex using unique_lock
std::unique_lock<std::mutex> lock(mtx, std::try_to_lock);
if(!lock.owns_lock()) {
return; // locking fails
}
// task for thread
auto task = [&](std::unique_lock<std::mutex>&& lock) {
// do async work and release lock when it done
lock.unlock();
// do something after releasing lock
};
// create thread, pass lock
std::thread taskThread(task, std::move(lock));
taskThread.detach();
}
我遇到了编译错误:
<lambda_1918cc58d906c210588b1a8bb33f1b0d>::operator
()(std::unique_lock<_Mutex> &&) const' : cannot convert parameter 1 from
'std::unique_lock<_Mutex>' to 'std::unique_lock<_Mutex> &&'
我应该如何适当地将std::unique_lock
传递给我的lambda函数?
更新: 实际上,这个函数是一个本地的C API库函数调用,它尝试异步启动一些库操作,并在任何情况下立即返回控制,向调用者返回一些返回代码。这个代码被简化以便集中讨论具体问题。
somefunc()
中的 lambda 表达式和unique_lock
都会unlock()
互斥量,这是未定义的行为。 - Praetorianstd::shared_ptr
)。 - Slavamutex
,这是不允许的。解锁它的线程必须与锁定它的线程相同。无论如何,您的代码在VC12上由于此错误而无法编译(链接:https://connect.microsoft.com/VisualStudio/feedback/details/729886). - Praetorian