尝试编写一些简单的多线程服务器程序并最近得到了错误:
Server.cpp:64:64:error:类型'void *(Server ::)(void *)'的参数与'void *(* )(空隙 *)
以下是我的代码中的一些行:
标题文件:
class Server
{
public:
void establishConnection(const char * );
...
private:
void *listening(void *);
void *acceptingConnection(void *);
pthread_attr_t attrr;
}
cpp文件:
void Server:: establishConnection(const char *port_number )
{
...
pthread_create(&listn, &attrr, Server::listening, (void*)socketfd);//pthread_t listn, socketfd is a socket destricptor(int)
pthread_join(listn, NULL);
}
void* Server::listening(void *arg)
{
int socketfd = (int)arg;
...
}
通常,如果我在cpp文件中定义线程函数原型而不是头文件,它可以正常工作(当然没有Server ::定义)尝试了一些其他的东西,比如(void *)Server :: listen,listening,(void *)听,但仍然没有工作。你能开导我吗?如何将方法参数传递给侦听方法?
其次,我正在学习c ++(已经知道C),在c ++程序中使用一些C方法,char *数组而不是字符串,头文件是真的吗?如string.h,stdlib.h,pthread.h?
答案 0 :(得分:1)
您只需阅读错误消息:
type ‘void* (Server::)(void*)’ does not match ‘void* (*)(void*)‘
因为Server::listening
是Server
的非静态成员函数,并且指针非静态成员函数不可能转换为指向非成员函数的指针。
您必须制作Server::listening
函数static
,或在Server
类之外编写独立函数。
答案 1 :(得分:1)
您需要为pthread_create()
创建一个包装函数,并从那里调用您的类方法。
class Server
{
...
private:
int sock;
};
extern "C" void * server_listening (void *arg) {
Server *s = static_cast<Server *>(arg);
return s->listening();
}
void Server:: establishConnection(const char *port_number )
{
...
this->sock = socketfd;
pthread_create(&listn, &attrr, server_listening, this);
pthread_join(listn, NULL);
}
由于extern "C"
是一个C函数,因此包装函数上的pthread_create()
链接就位,并且期望一个带C链接的函数指针。如果在您的系统上C ABI和C ++ ABI不相同,这一点很重要。类的静态方法只能有C ++链接。