为什么std::lock_guard
不可移动,如果可以移动的话,代码会更加优美:
auto locked = lock_guard(mutex);
替代
std::lock_guard<std::mutex> locked(mutex);
创建自己的版本是否存在问题,比如:
template <typename T> class lock_guard_
{
T* Mutex_;
lock_guard_(const lock_guard_&) = delete;
lock_guard_& operator=(const lock_guard_&) = delete;
public:
lock_guard_(T& mutex) : Mutex_(&mutex)
{
Mutex_->lock();
}
~lock_guard_()
{
if(Mutex_!=nullptr)
Mutex_->unlock();
}
lock_guard_(lock_guard_&& guard)
{
Mutex_ = guard.Mutex_;
guard.Mutex_ = nullptr;
}
};
template <typename T> lock_guard_<T> lock_guard(T& mutex)
{
return lock_guard_<T>(mutex);
}
有没有任何根本性的原因,使得将它变成可移动的不是一个好主意?
unique_lock
。这可能只是为了使接口尽可能简单。 - ecatmurunique_lock
完全相同的功能(尽管我认为它大多数情况下都是多余的)。因此,如果希望将lock_guard
作为单独的类使用,它实际上不能是可移动的。 - Grizzly