簡體   English   中英

有條件地獲取std :: mutex

[英]Conditionally acquire an std::mutex

我有一個使用GPU的多線程應用程序,它本質上是單線程的,而我嘗試使用的實際API cv::gpu::FAST_GPU確實在嘗試使用多線程時崩潰了,所以基本上:

static std::mutex s_FAST_GPU_mutex;

{
    std::lock_guard<std::mutex> guard(s_FAST_GPU_mutex);
    cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
}

現在,對代碼進行基准測試后,我發現FAST_GPU()的隔離度比CPU FAST()要快,但在實際應用程序中,我的其他線程花費大量時間等待鎖定,因此總體吞吐量更糟。

查看文檔,並在此答案看來,這可能是可能的:

static std::mutex s_FAST_GPU_mutex;
static std::unique_lock<std::mutex> s_FAST_GPU_lock(s_FAST_GPU_mutex, std::defer_lock);

{
    // Create an unlocked guard
    std::lock_guard<decltype(s_FAST_GPU_lock)> guard(s_FAST_GPU_lock, std::defer_lock);
    if (s_FAST_GPU_lock.try_lock())
    {
        cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
    }
    else
    {
        cv::FAST(/*parameters*/);
    }
}

但是,由於std::lock_guard僅接受std::adopt_lock ,因此不會編譯。 如何正確實施?

從多個線程同時訪問unique_lock實際上是不安全的。 我對您問題的opencv部分不熟悉,因此該答案集中在互斥鎖/鎖用法上。

static std::mutex s_FAST_GPU_mutex;
{
   // Create a unique lock, attempting to acquire
   std::unique_lock<std::mutex> guard(s_FAST_GPU_mutex, std::try_to_lock);
   if (guard.owns_lock())
   {
       cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
       guard.unlock(); // Or just let it go out of scope later
   }
   else
   {
       cv::FAST(/*parameters*/);
   }
}  

如果成功,它將嘗試獲取鎖,使用FAST_GPU ,然后釋放鎖。 如果已經獲取了鎖,則轉到第二個分支,調用FAST

如果在鎖定狀態下采用互斥鎖,則可以使用std::lock_guard ,如下所示:

{
    if (s_FAST_GPU_mutex.try_lock())
    {
        std::lock_guard<decltype(s_FAST_GPU_lock)> guard(s_FAST_GPU_mutex, std::adopt_lock);
        cv::gpu::FAST_GPU(/*params*/)(/*parameters*/);
    }
    else
    {
        cv::FAST(/*parameters*/);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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