[英]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
和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 :
互斥鎖必須被當前執行線程鎖定,否則行為未定義。
std::shared_timed_mutex::unlock()
的文檔具有相同的規范,因此也不能保證與該類一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.