gpt4 book ai didi

C++11 将 std::unique_lock 传递给 lambda

转载 作者:搜寻专家 更新时间:2023-10-31 00:13:51 24 4
gpt4 key购买 nike

我有一些试图锁定 std::mutex 的函数,如果 mutex 成功锁定,函数创建 std::thread 并使用 lambda 函数作为线程函数参数,并使用 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 libaray 调用,它尝试启动一些异步库操作并在任何情况下立即返回控制,返回一些返回代码给调用者。此代码经过简化以专注于特定问题。

最佳答案

您的代码 compiles在 gcc 和 clang 上。由于 a bug,它无法在 VS2013 (VC12) 上编译在要求 std::thread 构造函数的参数可复制的实现中。这会导致编译器尝试复制 std::unique_lock,这当然会失败。

但是,您的代码有未定义的行为,因为您在两个不同的线程中锁定和解锁 mutex,这是不允许的。解锁它的线程必须与之前锁定它的线程相同。

关于C++11 将 std::unique_lock<std::mutex> 传递给 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25428639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com