我正在使用pthread实现我自己的线程类。因此,我创建Thread类,如下所示:
class Thread
{
public:
Thread()
{
}
virtual void* run(void *params) = 0;
void start(void *params)
{
pthread_create (&threadId, 0, run, params);
pthread_join (threadId, 0);
}
private:
pthread_t threadId;
};在实现了这个类并覆盖了virtual run函数之后,我编译了这个项目。但是error: argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void*)’发生了。我的代码出了什么问题?
提前感谢:)
发布于 2013-04-17 09:02:42
pthread_create是一个C函数,对C++成员函数一无所知。您需要为它提供一个静态或非成员函数,并通过pthread_create的最后一个参数传递一个指向Thread对象的指针;类似于:
class Thread
{
virtual void* run(void *params) = 0;
void start(void * params)
{
this->params = params;
pthread_create(&threadId, 0, &Thread::static_run, this);
}
static void * static_run(void * void_this)
{
Thread * thread_this = static_cast<Thread*>(void_this);
return thread_this->run(thread_this->params);
}
private:
pthread_t threadId;
void *params;
};当然,在现代C++中,这要简单得多:
std::thread thread;
void start(void * params)
{
thread = std::thread([this]{run(params);});
}(当然,您不应该使用void*来传递参数,而且可能从一开始就没有很好的理由将线程包装在类中。)
发布于 2013-04-17 08:59:44
这就是编译器告诉你的。
pthread_create需要一个带有签名的函数:
void* (*)(void*)
它是一个函数指针。
但是,您使用此签名提供了一些东西:
void* (Thread::)(void*)
它不是函数指针,而是指向成员函数的指针。有一个区别:指向成员函数的指针需要一个对象的实例才能正常工作(在这里,它需要一个Thread的实例)。
通常的解决方案是让你的函数成为Thread :它将不再是一个成员函数-它不再需要run的实例来正常工作,你可以将当前的实例作为pthread_create的最后一个参数传递,以便在线程启动后对其执行操作。您只需要将参数保存在类本身中。
public:
void start(void *params)
{
this->my_thread_params = params;
pthread_create (&threadId, 0, run, static_cast<void*>(this));
}
private:
static void *run(void *my_object)
{
// here, my_object already contains the params you passed to the function start
static_cast<Thread*>(my_object)->my_member_function();
}发布于 2013-04-17 08:59:53
错误消息告诉您,指向Thread中接受并返回void* (void* (Thread::*)(void*))的成员函数的指针不能转换为指向接受并返回相同void*的函数的指针。
虽然成员函数的声明看起来类似于您需要的类型,但是有一个隐式的Thread类型的this指针,它需要在对Thread::run的任何调用中注入
https://stackoverflow.com/questions/16049640
复制相似问题