Fra*_*eux 3 c++ mutex language-lawyer c++14 visual-studio-2015
考虑以下示例,我创建一个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;
}
Run Code Online (Sandbox Code Playgroud)
该示例似乎与gcc 6.3运行良好,但在Visual Studio 2015中运行时断言失败,错误为"解锁无主互斥锁".
我注意到,如果我将示例切换为使用std::shared_timed_mutex,std::shared_lock然后示例成功完成.我还注意到,如果我删除显式,unlock那么示例成功完成,但是互斥锁似乎根本没有解锁(如果我再次尝试锁定互斥锁,则崩溃,gcc不会抱怨).
基于我在cppreference.com上看到的内容std::unique_lock,在我看来,原始示例应该运行良好.如果另一个线程做了什么,是否有关于std::mutex或std::unique_lock禁止线程?这可能是VC的错误吗?unlocklock
根据http://en.cppreference.com/w/cpp/thread/mutex/unlock:
必须通过当前执行线程锁定互斥锁,否则,行为未定义.
文档std::shared_timed_mutex::unlock()具有相同的规范,因此也不能保证与该类一起使用.