考虑下面的例子,我创建了一个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 中运行时断言失败,并出现错误“解锁无主互斥锁”.
我注意到如果我将示例切换为使用std::shared_timed_mutex and std::shared_lock然后示例成功完成。我还注意到,如果我删除显式的unlock
然后示例成功完成,但互斥体似乎根本没有解锁(如果我尝试再次锁定互斥体,VC 会崩溃,gcc 不会抱怨)。
根据我在 cppreference.com 上读到的内容std::unique_lock在我看来,原来的例子应该运行良好。做一些关于std::mutex
or std::unique_lock
禁止线程unlock
如果另一个线程执行了lock
?这可能是 VC 错误吗?
根据http://en.cppreference.com/w/cpp/thread/mutex/unlock :
互斥体必须由当前执行线程锁定,否则行为未定义。
的文档std::shared_timed_mutex::unlock()
具有相同的规范,因此也不能保证它可以与该类一起使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)