Luc*_*uca 2 c++ multithreading mutex move-constructor move-semantics
我正在研究C ++中的多线程,并且编写了一个简单的类,其中包含一个私有std::mutex对象,以便在调用成员funcrion时进行同步:
#include <mutex>
#include <iostream>
class SynchClass
{
public:
SynchClass() {}
void inline SynchronizedInterfaceFunction();
private:
std::mutex mMutex;
};
void inline SynchClass::SynchronizedInterfaceFunction()
{
std::lock_guard<std::mutex> lock(mMutex);
for (int i = 0; i < 10; i++)
std::cout << "thread n: " << std::this_thread::get_id() << " inside function" << std::endl;
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
现在,此函数具有deleted复制构造函数和复制赋值运算符,因为std :: mutex可以移动,但不能复制/分配。
因此,我为类提供了一个move构造函数(编译器不会自动生成):
class SynchClass
{
public:
// ... other members as before
SynchClass(SynchClass &&rhs) : mMutex(std::move(rhs.mMutex)) {}
};
Run Code Online (Sandbox Code Playgroud)
但是,当我在这行上做广告时,编译器抱怨我试图调用已删除的副本构造函数std::mutex:
In file included from main.cpp:5:0:
SynchClass.h: In constructor 'SynchClass::SynchClass(SynchClass&&)':
SynchClass.h:8:61: error: use of deleted function 'std::mutex::mutex(const std::mutex&)'
SynchClass(SynchClass &&rhs) : mMutex(std::move(rhs.mMutex)) {}
^
In file included from C:/Program Files/mingw64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/mutex:43:0,
from main.cpp:2:
C:/Program Files/mingw64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/bits/std_mutex.h:97:5: note: declared here
mutex(const mutex&) = delete;
Run Code Online (Sandbox Code Playgroud)
但是我std::move用来将左值转换为右值,因此应该调用std :: mutex的move构造函数。
我想念什么?
std::mutex不可复制且不可移动。它没有移动构造函数或赋值。图书馆要求mutex:
33.4.3.2互斥锁类型[thread.mutex.requirements.mutex]
3互斥锁类型应为DefaultConstructible和Destructible。如果互斥类型的对象的初始化失败,则将引发类型为system_error的异常。互斥体类型不能复制或移动。
如果要使您的类移动可构造,那么您将需要在某个时候添加另一个间接层,例如使用std::unique_ptr<std::mutex>。