【发布时间】:2017-03-29 02:34:28
【问题描述】:
我有一个使用 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() 快,但在实际应用中,我的其他线程花费大量时间等待锁定,因此整体吞吐量更差。
查看文档,at this answer 似乎这是可能的:
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,因为通常你不希望2个线程访问同一个unique_lock。也就是说,我会删除 s_FAST_GPU_LOCK,然后使用std::try_to_lock,并使用owns_lock测试它是否成功。 -
@DaveS 啊,我明白了 -
mutex.try_lock()然后是lock_guard<>(std::adopt_lock)?请将此作为答案。