Code 1:
class thread_obj {
private:
static int instances;
bool run;
static mutex lock;
int threadno;
static map<int, thread> mapOfThreads;
public:
thread_obj():run(true)
{
lock.lock();
threadno = instances++;
thread th(thread_obj::thredfunc, this);
mapOfThreads[threadno] = move(th);
cout << "Thread no is " << threadno << endl;
lock.unlock();
}
static void thredfunc(thread_obj* ptr)
{
while (ptr->run)
{
std::this_thread::sleep_for(100ms);
}
}
void operator()()
{
while (run)
{
std::this_thread::sleep_for(100ms);
}
}
void stop()
{
run = false;
}
static int getTotalthreads()
{
return mapOfThreads.size();
}
~thread_obj()
{
lock.lock();
stop();
if (mapOfThreads[threadno].joinable())
mapOfThreads[threadno].join();
mapOfThreads.erase(threadno);
cout << "Destroyed " << threadno << endl;
lock.unlock();
}
};
int thread_obj::instances = 0;
mutex thread_obj::lock;
map<int, thread> thread_obj::mapOfThreads;
Code 2:
thread_obj():run(true)
{
lock.lock();
threadno = instances++;
thread th(thread_obj(), this);
mapOfThreads[threadno] = move(th);
cout << "Thread no is " << threadno << endl;
lock.unlock();
}
First code works fine, but changing constructor like given in code 2 gives error. In code 1 constructor create thread from static function.In code two constructor calls non static operator()
'std::invoke': no matching overloaded function found
Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
What is the reason behind this? (This code is created to handle multiple threads.)