我有一个大的,但可能不同,这是同时写入的对象的数量。 我想保护与互斥的访问。 为此,我认为我使用std::vector<std::mutex>
,但这不起作用,因为std::mutex
没有复制或移动构造,而std::vector::resize()
要求那。
什么是推荐的解决这个难题?
编辑 :难道所有的C ++随机接入容器需要调整大小复制或移动构造函数? 将标准:: deque的帮助?
再次编辑
首先,感谢所有的想法。 我不感兴趣避免mutices和/或将其移动到目标(从我透露更多细节/克制的原因)解决方案。 因此,考虑到我想mutices(其中调整是保证在没有互斥体被锁定的发生)的可调数量的问题,那么,似乎有几种解决方案。
1,我可以用mutices固定数量和使用哈希函数从对象映射到mutices(如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<mutex_wrapper>
3,我可以使用std::unique_ptr<std::mutex>
管理单个互斥体(如马蒂亚斯的答案)。 这种方法的问题在于,每一个互斥体被单独分配和堆解除分配。 因此,我更喜欢
4 std::unique_ptr<std::mutex[]> mutices( new 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)我应该使用?