我如何使用 std::vector<std::mutex> 之类的东西?

我有大量但可能不同的对象同时写入.我想用互斥锁保护该访问.为此,我以为我使用了 std::vector,但这不起作用,因为 std::mutex 没有副本或移动构造函数,而 std::vector::resize() 需要.

这个难题的推荐解决方案是什么?

编辑:所有 C++ 随机访问容器都需要复制或移动构造函数来重新调整大小吗?std::deque 有帮助吗?

再次编辑

首先,感谢您的所有想法.我对避免静音和/或将它们移动到对象中的解决方案不感兴趣(我不提供细节/原因).所以考虑到我想要一个可调整数量的互斥锁(在没有互斥锁被锁定的情况下保证发生调整)的问题,那么似乎有几种解决方案.

1 我可以使用固定数量的 mutic,并使用哈希函数从对象映射到 mutic(如 Oblivous 船长的回答).这样会产生冲突,但是如果mutices的数量远大于线程的数量,但仍然小于对象的数量,那么冲突的数量应该很小.

2 我可以定义一个包装类(如 ComicSansMS 的回答),例如

struct mutex_wrapper : std::mutex
{
  mutex_wrapper() = default;
  mutex_wrapper(mutex_wrapper const&) noexcept : std::mutex() {}
  bool operator==(mutex_wrapper const&other) noexcept { return this==&other; }
};

并使用 std::vector.

3 我可以使用 std::unique_ptr<std::mutex> 来管理单个互斥锁(如 Matthias 的回答).这种方法的问题是每个互斥体都是在堆上单独分配和取消分配的.因此,我更喜欢

4 std::unique_ptrmutices( 新 std::mutex[n_mutex] );

当初始分配一定数量的 n_mutex mutices 时.如果以后发现这个数字不够,我干脆

if(need_mutex > n_mutex) {
  mutices.reset( new std::mutex[need_mutex] );
  n_mutex = need_mutex;
}

那么我应该使用这些 (1,2,4) 中的哪一个?

ljxljy 回答:我如何使用 std::vector&lt;std::mutex&gt; 之类的东西?

vector 要求值是可移动的,以便随着值的增长保持连续的值数组.您可以创建一个包含互斥体的向量,但您无法执行任何可能需要调整其大小的操作.

其他容器没有这个要求;deque 或 [forward_]list 应该可以工作,只要您在构建过程中或使用 emplace() 就地构建互斥锁或 resize().insert() 和 push_back() 等函数将不起作用.

或者,您可以添加额外的间接级别并存储unique_ptr;但是您在另一个答案中的评论表明您认为动态分配的额外成本是不可接受的.

这篇关于我如何使用 std::vector&lt;std::mutex&gt; 之类的东西?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持前端之家!

本文链接:https://www.f2er.com/3186438.html

大家都在问