gpt4 book ai didi

c++ - 有条件地获取 std::mutex

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:44 28 4
gpt4 key购买 nike

我有一个使用 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 实际上是不安全的。我不熟悉你问题的 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

关于c++ - 有条件地获取 std::mutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43083271/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com