将锁定的 std::unique_lock 移交给新线程
Handing over locked std::unique_lock to new threads
考虑下面的例子,我创建了一个 std::mutex
,锁定它,然后将锁交给另一个线程:
#include <future>
#include <mutex>
int main()
{
// Create and lock a mutex
std::mutex mutex;
std::unique_lock<decltype(mutex)> lock(mutex);
// Hand off the lock to another thread
auto promise = std::async(std::launch::async,
[lock{ std::move(lock) }]() mutable
{
// Unlock the mutex
lock.unlock();
});
promise.get();
return 0;
}
该示例似乎 运行 在 gcc 6.3 中正常,但在 Visual Studio 2015 的 运行 时间断言失败,错误为 "unlock of unowned mutex".
我注意到,如果我将示例切换为使用 std::shared_timed_mutex
and std::shared_lock
,则示例会成功完成。我还注意到,如果我删除显式 unlock
那么该示例将成功完成,但互斥量似乎根本没有解锁(如果我再次尝试锁定互斥量, VC 会崩溃, gcc 没有抱怨)。
根据我在 cppreference.com 上读到的关于 std::unique_lock
的内容,在我看来,原始示例应该 运行 没问题。如果另一个线程执行了 lock
,关于 std::mutex
或 std::unique_lock
是否禁止线程执行 unlock
?这可能是 VC 错误吗?
根据http://en.cppreference.com/w/cpp/thread/mutex/unlock:
The mutex must be locked by the current thread of execution, otherwise, the behavior is undefined.
std::shared_timed_mutex::unlock()
的文档具有相同的规范,因此不能保证它也适用于 class。
考虑下面的例子,我创建了一个 std::mutex
,锁定它,然后将锁交给另一个线程:
#include <future>
#include <mutex>
int main()
{
// Create and lock a mutex
std::mutex mutex;
std::unique_lock<decltype(mutex)> lock(mutex);
// Hand off the lock to another thread
auto promise = std::async(std::launch::async,
[lock{ std::move(lock) }]() mutable
{
// Unlock the mutex
lock.unlock();
});
promise.get();
return 0;
}
该示例似乎 运行 在 gcc 6.3 中正常,但在 Visual Studio 2015 的 运行 时间断言失败,错误为 "unlock of unowned mutex".
我注意到,如果我将示例切换为使用 std::shared_timed_mutex
and std::shared_lock
,则示例会成功完成。我还注意到,如果我删除显式 unlock
那么该示例将成功完成,但互斥量似乎根本没有解锁(如果我再次尝试锁定互斥量, VC 会崩溃, gcc 没有抱怨)。
根据我在 cppreference.com 上读到的关于 std::unique_lock
的内容,在我看来,原始示例应该 运行 没问题。如果另一个线程执行了 lock
,关于 std::mutex
或 std::unique_lock
是否禁止线程执行 unlock
?这可能是 VC 错误吗?
根据http://en.cppreference.com/w/cpp/thread/mutex/unlock:
The mutex must be locked by the current thread of execution, otherwise, the behavior is undefined.
std::shared_timed_mutex::unlock()
的文档具有相同的规范,因此不能保证它也适用于 class。