Проблема с insert
заключается в том, что копия RawThread
создается путем вызова
template<class Function, class... Args>
RawThread(Function&&f, Args&&... args)
затем Function
является экземпляром RawThread
, а Args
пусто. Конструктор std::thread
может принять экземпляр объекта в качестве первого параметра, но затем класс этого экземпляра должен предоставить operator()()
в качестве тела потока. Ваш класс пропускает это. Вы можете добавить его, и код скомпилируется.
class RawThread {
//....
void operator()() {}
};
Но это не то, что вы хотите.
Для меня вы должны реализовать RawThread
так, чтобы только один экземпляр этого класса поддерживал активный указатель mThread
. RawThread
следует только перемещать, копии следует отключать. В случае, когда многие экземпляры имеют одно и то же значение mThread
, какой из них следует вызвать join или удалить этот объект?
Версия, которая поддерживает только перемещение, может быть:
#include <map>
#include <utility>
#include <thread>
class RawThread {
public:
~RawThread()
{
if (mThread)
{
if (mThread->joinable())
mThread->join();
delete mThread;
}
}
RawThread(RawThread&& theOther) {
mThread = theOther.mThread;
theOther.mThread = nullptr;
}
RawThread& operator=(RawThread&& theOther) {
mThread = theOther.mThread;
theOther.mThread = nullptr;
return *this;
}
template<class Function, class... Args>
RawThread(Function&&f, Args&&... args) {
mThread = new std::thread(std::forward<Function>(f),
std::forward<Args>(args)...);
}
void join() {
mThread->join();
}
std::thread* mThread;
};
void hello(int x){while(true)++x;}
int main()
{
int arg = 0;
RawThread myThread(&hello, arg);
unsigned int threadId = 0;
std::map<unsigned int, RawThread> threadMap;
threadMap.emplace(threadId,std::move(myThread)); // move object into map
return 0;
}