无法将 std::unique_lock 移动到结构中
Can't move a std::unique_lock into a struct
我正在尝试创建一个非常简单的C++类来实现线程安全列表,即当您访问它时会自动锁定的列表。不幸的是,编译器不想允许我创建和返回包含unique_lock
的结构。这是我最初尝试的:
template<typename T>
struct LockedQueue {
private:
std::mutex mutex;
using lock_t = std::unique_lock<std::mutex>;
std::list<T> underlying_list;
public:
struct LockedListAccess {
private:
lock_t lock;
public:
std::list<T> &access;
};
LockedListAccess locked() {
return LockedListAccess{ lock_t{mutex}, underlying_list };
}
};
这失败了
no matching function for call to ‘LockedQueue<tcp::socket>::LockedListAccess::LockedListAccess(<brace-enclosed initializer list>)
我猜这意味着结构的大括号初始值设定项列表/C++11 统一初始化不适用于 std::unique_lock 等仅移动类型。所以我尝试为我的结构创建一个显式构造函数,该构造函数将unique_lock作为右值引用,并将其移动到成员中:
template<typename T>
struct LockedQueue {
private:
std::mutex mutex;
using lock_t = std::unique_lock<std::mutex>;
std::list<T> underlying_list;
public:
struct LockedListAccess {
private:
lock_t lock;
public:
std::list<T> &access;
LockedListAccess(lock_t&& l, std::list<T>& a) :
lock(l), access(a) {};
};
LockedListAccess locked() {
return LockedListAccess{ std::move(lock_t{mutex}), underlying_list };
}
};
但是,这也失败了,给了我错误
error: use of deleted function ‘std::unique_lock<_Mutex>::unique_lock(const std::unique_lock<_Mutex>&) [with _Mutex = std::mutex]’
这个编译器错误特别令人困惑,因为它指向包含 lock(l), access(a)
的行,作为我尝试使用 std::unique_lock 已删除的复制构造函数的行。我声明l
为lock_t&&
,那么我怎么可能调用复制构造函数呢?
我在互联网上能找到的大多数资源似乎都表明你可以用std::move四处移动unique_locks,尽管似乎没有人解决如何使用std::move构造一个包含unique_lock的对象的问题。我在这里可能做错了什么?
问题:
在 LockedListAccess
构造函数的上下文中,lock_t&& l
实际上是一个 l 值。因此,您需要使用 std::move
将其转换回 r 值。一般经验法则:始终std::move
r 值引用,并始终std::forward
转发引用。
溶液:
LockedListAccess(lock_t&& l, std::list<T>& a)
: lock(std::move(l))
, access(a)
{}
此外,您不需要移动临时锁定对象,因为编译器会自动将临时对象绑定到 r 值引用。
这:
LockedListAccess locked() {
return LockedListAccess{ std::move(lock_t{mutex}), underlying_list }
}
可以变成这样:
LockedListAccess locked() {
return LockedListAccess{ lock_t{mutex}, underlying_list }
}
相关文章:
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- MSVC将仅移动结构参数解释为指针
- 设计将引用元素移动到开头的数据结构.C++
- 在 c++ 中将数据从未对齐结构数组移动到对齐结构数组
- 在继承层次结构中复制和移动
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 为什么结构化绑定禁用RVO和移动返回语句
- 如何使用 spirit x3 将解析的结果移动到结构中
- 如何使用结构在 2d 数组中移动玩家对象
- C++将unique_ptr移动到结构成员
- C++:从动态结构数组中删除元素并移动其他元素
- 移动指针是否经过结构成员 UB?并访问它?
- 在对结构数组的一个成员进行排序后,移动其成员的其余部分
- 自定义分配器上的额外移动结构用于叮当声
- 移动一个结构数组C++
- 在OpenGL中移动一个简单的形状(形状在数据结构中)
- 复制/移动结构到另一个结构
- 有没有一个简单的移动结构的例子不会被忽略?
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 向量的移动结构