问题
My aim is to keep an std::thread
object as data member, and initialize it when needed.
I'm not able to do this (as in my code below) because the copy constructor of the std::thread
class is deleted. Is there any other way to do it?
class MyClass
{
public:
MyClass():DiskJobThread(){};
~MyClass();
void DoDiskJobThread();
private:
int CopyThread(const std::wstring & Source, const std::wstring & Target);
int MoveThread(const std::wstring & Source, const std::wstring & Target);
std::thread DiskJobThread;
};
MyClass::~MyClass()
{
DiskJobThread.join();
}
void MyClass::DoDiskJobThread()
{
std::wstring Source = GetSource();
std::wstring Target = GetTarget();
int m_OperationType = GetOperationType();
if (m_OperationType == OPERATION_COPY)
{
DiskJobThread = std::thread(&MyClass::CopyThread, *this, Source, Target);
}
else if (m_OperationType == OPERATION_MOVE)
{
DiskJobThread = std::thread(&MyClass::MoveThread, *this, Source, Target);
}
}
回答1:
Your problem is something else - you're passing an instance of MyClass
into the thread instead of the pointer to MyClass
which the member functions expect. Simply change DoDiskJobThread()
like this (do not dereference this
):
void MyClass::DoDiskJobThread()
{
std::wstring Source = GetSource();
std::wstring Target = GetTarget();
int m_OperationType = GetOperationType();
if (m_OperationType == OPERATION_COPY)
{
DiskJobThread = std::thread(&MyClass::CopyThread, this, Source, Target);
}
else if (m_OperationType == OPERATION_MOVE)
{
DiskJobThread = std::thread(&MyClass::MoveThread, this, Source, Target);
}
}
You were getting the error because *this
resulted in trying to copy MyClass
into the thread function, and the copy ctor of your class is deleted (because that of std::thread
is deleted). However, the member functions CopyThread
and MoveThread
require a pointer as the first (hidden) argument anyway.
Live demonstration
回答2:
How about wrapping it in a pointer?
std::unique_ptr<std::thread> thread_ptr;
// Look into std::make_unique if possible
thread_ptr = std::unique_ptr<std::thread>(new std::thread(...));
Edit: And yes, the others have mentioned it and I didn't feel the need to add it here, but in order to avoid more downvote piling, I'll say it: You are passing *this
and not this
thereby copying an instance of your class. (Problems arise because it's non-copyable. Pass this
and you should be good to go.)
回答3:
You can't initialize the thread object after it's created; by definition, initialization occurs when an object is created. But you can use swap
to move a thread object into another:
std::thread thr1; // no thread of execution
std::thread thr2(my_function_object); // creates thread of execution
thr1.swap(thr2); // thr1 is now running the thread created as thr2
// and thr2 has no thread of execution
来源:https://stackoverflow.com/questions/18375998/is-it-possible-to-define-an-stdthread-and-initialize-it-later