boost线程互斥数组

2023-11-25

我的问题是,我有多个线程更新的块矩阵。 多个线程可能一次更新不相交的块,但通常可能存在竞争条件。现在矩阵使用单锁锁定。

问题是,是否可能(如果可能,如何实现?) 实现高效的锁数组,以便一次只能锁定矩阵的一部分。

所讨论的矩阵可能会变得相当大,约为 50^2 块。我最初的猜测是使用动态分配互斥体的向量/映射。

这是个好方法吗? 使用多个条件变量是否更好? 有更好的方法吗?


使用单锁。但不是用它来保护整个矩阵,而是用它来保护一个std::set (or a boost::unordered_set) 表示哪些块被“锁定”。

像这样的东西。

class Block;

class Lock_block
{
public:
   Lock_block( Block& block ) : m_block(&block)
   {
      boost::unique_lock<boost::mutex> lock(s_mutex);
      while( s_locked.find(m_block) != s_locked.end() )
      {
         s_cond.wait(lock);
      }
      bool success = s_locked.insert(m_block).second;
      assert(success);
   }

   ~Lock_block()
   {
      boost::lock_guard<boost::mutex> lock(s_mutex);
      std::size_t removed = s_locked.erase(m_block);
      assert(removed == 1);
      s_cond.notify_all();
   }
private:
   Block* m_block;

   static boost::mutex s_mutex;
   static boost::condition s_cond;
   static std::set<Block*> s_locked;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost线程互斥数组 的相关文章

随机推荐