[英]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.