gpt4 book ai didi

c++ - boost 线程互斥数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:27 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

像这样。

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;
};

关于c++ - boost 线程互斥数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144349/

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