首页 > 解决方案 > 如何判断有另一个线程试图持有互斥锁?

问题描述

我有一个算法,效率很关键,90% 的时间在单线程模式下运行。现在我们意识到还有另外 10% 的用例需要让它支持多线程。

可悲的部分是该算法的一部分,在多线程情况下确实需要互斥保护。这个关键部分重复了数十亿次,因此将互斥操作保持在单线程中确实是浪费滴答声。

是否可以让一个类“感知互斥锁”,以便我们仅在检测到有另一个线程运行该类实例时才触发互斥锁保护?c++ 的最佳实践是什么?

更新:有些人认为问题不清楚。我的错。让我尝试更多细节。

系统 90% 的时间都在连续扫描大量数据(想象成许多数据框),并将统计信息发送给其他线程,但细节不多。然后有时,如果一个 RPC 客户端得到一些有趣的东西,它会询问特定范围的框的更多信息。在盒子之间移动非常昂贵,因此这里没有随机访问。此时,客户端算法会按计划返回以获取那些特定的盒子。现在它是子算法(即处理一个单一的盒子)在这里需要互斥锁(以维护指针状态,边界处理和许多其他东西等)。

因为算法 90% 的时间都是单线程模式,所以我只希望它快速移动,而不是在每个盒子上获取锁。而当有客户想要寻找和使用单盒算法时,这将成为互斥锁发挥作用的唯一情况(我们只能在运行时知道)。

标签: c++multithreadingmutex

解决方案


一种方法是将您的代码模板化为互斥锁类型,然后在单线程情况下传递一个假互斥锁。例如这样的:

template<typename Mutex>
void foo( Mutex& mutex)
{
   std::unique_lock lock(mutex);
   // Do stuff
}

然后您可以使用和不使用互斥锁进行调用:

std::mutex mutex;
foo(mutex);

struct fake_mutex
{
   void lock(){}
   void unlock(){}
};

fake_mutex mutex;
foo(mutex);

编译器应该将假互斥体优化为很少甚至没有代码。


推荐阅读