C++ boost线程互斥数组
我的问题是,我用多个线程更新了块矩阵。 多个线程可能一次更新不相交的块,但通常可能存在争用条件。现在矩阵是使用单锁锁定的 问题是,这可能吗(如果可能,怎么可能?) 实现一个高效的锁数组,以便一次只能锁定矩阵的一部分 所讨论的矩阵可能会变得相当大,大约50^2个块。我最初的猜测是使用动态分配向量/互斥映射 这是个好办法吗? 使用多个条件变量是否更好?C++ boost线程互斥数组,c++,performance,boost,multithreading,C++,Performance,Boost,Multithreading,我的问题是,我用多个线程更新了块矩阵。 多个线程可能一次更新不相交的块,但通常可能存在争用条件。现在矩阵是使用单锁锁定的 问题是,这可能吗(如果可能,怎么可能?) 实现一个高效的锁数组,以便一次只能锁定矩阵的一部分 所讨论的矩阵可能会变得相当大,大约50^2个块。我最初的猜测是使用动态分配向量/互斥映射 这是个好办法吗? 使用多个条件变量是否更好? 有更好的方法吗?您可以使用以下几种方法: 如果CriticalSection/Mutex(2500不是那么多)预先分配数组,并使用块索引作为锁索引来
有更好的方法吗?您可以使用以下几种方法:
使用一把锁。但不是用它来保护整个矩阵,而是用它来保护表示哪些块被“锁定”的
std::set
(或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;
};
类块;
类锁块
{
公众:
锁定块(块和块):m块和块
{
boost::唯一的_锁(s_互斥);
while(s_locked.find(m_block)!=s_locked.end())
{
秒等待(锁定);
}
bool success=s_locked.insert(m_block).second;
断言(成功);
}
~Lock_block()
{
boost::lock\u guard lock(s\u互斥锁);
std::size\u t removed=s\u locked.erase(m\u块);
断言(删除==1);
s_cond.notify_all();
}
私人:
块*m_块;
静态boost::mutex s_mutex;
静态增压:条件s_cond;
静态标准::设置s_锁定;
};
您是否总是在程序中使用同一个矩阵?或者它是一系列矩阵(如视频处理)?这确实更简单。非常感谢。