看看下面的例子,我創建一個std::mutex
,將其鎖定,然後用手將鎖定到另一個線程:移交鎖定的std :: unique_lock新線程
#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
和std::shared_lock
,那麼該示例將成功完成。我也注意到,如果我刪除了明確的unlock
,那麼該示例成功完成,但互斥鎖似乎根本不能解鎖(如果我嘗試再次鎖定互斥鎖,gcc會崩潰,gcc不會抱怨)。
基於我在cppreference.com上閱讀的關於std::unique_lock
的內容,在我看來,原始示例應該運行良好。如果另一個線程執行了lock
,std::mutex
或std::unique_lock
是否禁止線程爲unlock
?這可能是一個VC錯誤?
它與'std :: unique_lock'不相關,它只是調用互斥體上的鎖定/解鎖,而不是互斥體本身。 – Slava