c++ - 互斥体作为对象属性和对象向量
问题描述
我正在做一个有多个线程的书店管理项目。我有一个类,Shelf(),它包含一个互斥锁作为属性。编译时出现以下错误:
error: use of deleted function 'Shelf& Shelf::operator=(const Shelf&)'
*__result = *__first;
note: 'Shelf& Shelf::operator=(const Shelf&)' is implicitly declared as deleted because 'Shelf' declares a move constructor or move assignment operator
class Shelf {
我的项目结构如下:
1. Book() 有一些字符串,如:名称、流派...
2. Shelf() 有:可变互斥体和一个无序的 id 和 Book* 映射
3. Library() 有: Shelf 的向量对象。
我在这里看到了 如何在 C++ 中处理可移动类型中的互斥锁?互斥锁不可复制/移动,所以我按照@HowardHinnant 回答的说明进行操作。
typedef std::unordered_map<Id_t, Book *> hash_map_books_t;
class Shelf {
using MutexType = std::mutex;
using ReadLock = std::unique_lock<MutexType>;
using WriteLock = std::unique_lock<MutexType>;
private:
//ATTRIBUTES
mutable MutexType m_mutex;
std::string m_genre;
hash_map_books_t m_shelf;
public:
//CONSTRUCTORS & MOVE & COPY & DESTRUCTORS
Shelf() = default;
~Shelf(){
for (auto b : m_shelf) {
delete b.second;
}
m_shelf.clear();
}
Shelf(Shelf &&shelf) noexcept{
WriteLock rhs_lk(shelf.m_mutex);
m_genre = std::move(shelf.m_genre);
m_shelf = std::move(shelf.m_shelf);
}
Shelf(const Shelf &a){
ReadLock rhs_lk(a.m_mutex);
m_genre = a.m_genre;
m_shelf = a.m_shelf;
}
Shelf& operator=(Shelf &&a) noexcept{
if (this != &a) {
WriteLock lhs_lk(m_mutex, std::defer_lock);
WriteLock rhs_lk(a.m_mutex, std::defer_lock);
std::lock(lhs_lk, rhs_lk);
m_genre = std::move(a.m_genre);
m_shelf = std::move(a.m_shelf);
}
return *this;
}
};
即使不是我的问题的目的,我也愿意接受你可以告诉我的其他结构。
解决方案
正如错误消息所解释的,您需要提供一个复制赋值运算符,例如:
Shelf& operator= (const Shelf &a)
{
if (this != &a)
{
WriteLock lhs_lk (m_mutex, std::defer_lock);
ReadLock rhs_lk (a.m_mutex, std::defer_lock);
std::lock (lhs_lk, rhs_lk);
m_genre = a.m_genre;
m_shelf = a.m_shelf;
}
return *this;
}
用户定义的移动构造函数或用户定义的移动赋值运算符的存在使得这成为必要。你两者都有。
推荐阅读
- haskell - 将有理数转换为字符串
- html - 试图将图像放在网格内
- elasticsearch - 在 QueryBuilders 中使用 termQuery 时,Elasticsearch 返回零命中
- php - JsonResource 和 ResourceCollection 有什么区别?在 Laravel v6 或 v7 中
- c# - TWAINDotNet 抛出 BadImageFormat 异常
- vimeo - 通过 Python 请求上传到 Vimeo API 时忽略 Redirect_url
- python - 如何从列表中删除具有 NaN 值的字典
- python - 每次按下按钮时如何播放声音而不冻结Tkinter
- r - 在 R 中合并许多具有不同列和标题的 csv 文件
- haskell - unsafeDupablePerformIO 和 accursedUnutterablePerformIO 有什么区别?