簡體   English   中英

將鎖定的 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_mutexstd::shared_lock則示例成功完成。 我還注意到,如果我刪除顯式unlock則示例成功完成,但互斥鎖似乎根本沒有解鎖(如果我再次嘗試鎖定互斥鎖,VC 會崩潰,gcc 不會抱怨)。

根據我在 cppreference.com 上讀到的關於std::unique_lock ,在我看來,原始示例應該運行良好。 如果另一個線程進行了lock則有關std::mutexstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM