无法特化函数模板 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
代码 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;
代码 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();
}
第一个代码工作正常,但像代码 2 中给出的那样更改构造函数会出错。在代码 1 中,构造函数从静态 function.In 代码中创建线程,两个构造函数调用非静态运算符 ()
'std::invoke': no matching overloaded function found
Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
这背后的原因是什么?
(创建此代码是为了处理多个线程。)
构造函数中的这一行是废话:
thread th(thread_obj(), this);
这将构造另一个 thread_obj()
对象,然后尝试在一个新线程中调用它,将其传递给 this
指针,即 thread_obj*
指针。这只有在 operator()
函数采用 thread_obj*
参数时才有效,但它没有。
我想你想做的是 运行 this->operator()()
在一个新线程中,所以你会这样做:
thread th(std::ref(*this));
这将创建一个引用 *this
的新线程,然后它将像 (*this)()
一样调用它,这将调用 operator()()
。
或者,重命名 operator()
函数,为其指定一个合适的名称,例如:
void thread_func()
{
while (run)
{
std::this_thread::sleep_for(100ms);
}
}
然后在构造函数中将 pointer-to-member-function 传递给 std::thread
构造函数,以 this
作为调用该成员函数的对象:
thread th(&thread_obj::thread_func, this);
Whosebug 上有 数百 个现有问题,解释了如何 运行 std::thread
中的成员函数。
代码 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;
代码 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();
}
第一个代码工作正常,但像代码 2 中给出的那样更改构造函数会出错。在代码 1 中,构造函数从静态 function.In 代码中创建线程,两个构造函数调用非静态运算符 ()
'std::invoke': no matching overloaded function found
Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...) noexcept(<expr>)'
这背后的原因是什么? (创建此代码是为了处理多个线程。)
构造函数中的这一行是废话:
thread th(thread_obj(), this);
这将构造另一个 thread_obj()
对象,然后尝试在一个新线程中调用它,将其传递给 this
指针,即 thread_obj*
指针。这只有在 operator()
函数采用 thread_obj*
参数时才有效,但它没有。
我想你想做的是 运行 this->operator()()
在一个新线程中,所以你会这样做:
thread th(std::ref(*this));
这将创建一个引用 *this
的新线程,然后它将像 (*this)()
一样调用它,这将调用 operator()()
。
或者,重命名 operator()
函数,为其指定一个合适的名称,例如:
void thread_func()
{
while (run)
{
std::this_thread::sleep_for(100ms);
}
}
然后在构造函数中将 pointer-to-member-function 传递给 std::thread
构造函数,以 this
作为调用该成员函数的对象:
thread th(&thread_obj::thread_func, this);
Whosebug 上有 数百 个现有问题,解释了如何 运行 std::thread
中的成员函数。