C++ std::线程构造函数参数错误使用非静态成员函数无效

C++ std::线程构造函数参数错误使用非静态成员函数无效,c++,multithreading,C++,Multithreading,我正在使用线程管理器编写多线程应用程序,其中包含所有线程并允许对其进行操作,但当我将任何参数传递给std::thread的构造函数时,我得到错误:使用非静态成员函数无效 我做的第一件事是尝试传递简单的void函数(void),这样做和检查它是否工作都很容易。我尝试传递void ClassName::function(void)和void this->function(void),但没有任何效果。我甚至试着按照我之前所说的方式传递对函数的引用,但它在代码中产生了更多的错误 此外,我不想将任何函数更

我正在使用线程管理器编写多线程应用程序,其中包含所有线程并允许对其进行操作,但当我将任何参数传递给std::thread的构造函数时,我得到错误:使用非静态成员函数无效

我做的第一件事是尝试传递简单的void函数(void),这样做和检查它是否工作都很容易。我尝试传递void ClassName::function(void)和void this->function(void),但没有任何效果。我甚至试着按照我之前所说的方式传递对函数的引用,但它在代码中产生了更多的错误

此外,我不想将任何函数更改为静态,因此请尝试在不将函数更改为静态的情况下提供帮助

ThreadManager.cpp:

class-ThreadMaster
{
静态线程*m_线程[MAX_threads_ALLOC];
...
公众:
静态void addThread(thread*thrd,int*ret);
...
};
thread*ThreadMaster::m_threads[MAX_threads_ALLOC]={nullptr};
互斥线程主机::m_mtx;
void ThreadMaster::addThread(线程*thrd,int*ret)
{
对于(int i=0;i
SocketManager.cpp:

#包括
使用名称空间std;
类SocketApplication
{
...
受保护的:
无效检查线程(int thr、int*客户端);
无效thr_过程(int*curcli);
...
}
void SocketApplication::check_线程(int-thr,int*client)
{
std::this_线程::sleep_for(std::chrono::毫秒(2500));
if(threadTimer.GetTime()>2)
{
ThreadMaster::连接螺纹(thr);
写入(m_sockmgr->GetDevice(*client)->socket,“tot”,sizeof(char)*3);
m_sockmgr->removeClient(*客户端);
printf(“[-]某些客户端没有响应\n”);
ThreadMaster::addThread(新线程(这个->thr_进程,客户端),nullptr);//错误
ThreadMaster::addThread(nullptr,nullptr);//无错误
}
}
g++编译器(g++./src/main.cpp-lpthread-std=c++14-Wno write strings-fppermissive-o./build/server)

/src/net/socketManager.cpp:152:69:错误:非静态成员函数的使用无效
ThreadMaster::addThread(新线程(这个->thr_进程,客户端),nullptr);

我希望这段代码编译时不会出现任何错误,因此它可以成功运行,但正如您所看到的,它会产生编译错误。

我正在使用boost库,这是我的一些代码的剪切粘贴:

boost::thread * myThread = new boost::thread(&TCPServerMaster::run, this);
这里有一个非boost线程:

subscriptionThread = new thread(std::bind(&PubNubREST::subscriptionRunner, this));
两种情况下的第二个参数都是要运行的对象。在我的例子中,我有一个startThread()方法,运行程序针对同一个对象

new thread(this->thr_process, client)
这不是寻址成员函数的方法,另外还需要绑定
this
指针,以便线程知道调用它的对象

幸运的是,
线程
的构造函数使这变得很容易(回想一下,成员函数中有一个隐藏的“this”第一个参数,该特性模拟了该参数):

阅读书中有关线程的章节以了解更多信息


也考虑减少您过度使用动态分配。请按要求在这里发布。没有足够的信息来解决您的问题。是的,谢谢,它成功了。我花了一整天的时间尝试各种各样的方法来修正这个错误,我甚至都没想到我能做到这一点。谢谢。靠猜测编程是行不通的!阅读你的书(或)你不需要的

std::bind
std::thread
构造函数知道如何做到这一点。
new thread(&thr_process, this, client)