当我尝试将我的功能cleanup_thread()
传递给pthread_cleanup_push()
时:
pthread_cleanup_push(cleanup_thread, arg);
我收到以下编译错误:
error: no matching function for call to ‘__pthread_cleanup_class::__pthread_cleanup_class(<unresolved overloaded function type>, void*&)’
我猜它是因为void cleanup_thread(void *arg)
是我的类的成员函数,因此this
指针作为第一个参数。所以函数cleanup_thread()的签名不匹配。
如何告诉pthread_cleanup_push()
使用我的会员功能cleanup_thread()
?
答案 0 :(得分:1)
最简单的解决方案可能是使函数成为static
成员函数,并将实例指针作为参数传递。
这样的事情:
struct data_struct
{
some_class* instance;
pthread_t thread_id;
};
class some_class
{
public:
...
static void cleanup_thread(void* arg)
{
data_struct* ptr = reinterpret_cast<data_struct*>(arg);
ptr->instance->private_cleanup_thread();
delete ptr;
}
private:
void private_cleanup_thread()
{
...
}
};
...
some_class* some_class_ptr = new some_class;
...
data_struct* data_ptr = new data_struct;
data_ptr->instance = some_class_ptr;
data_ptr->thread_id = some_thread_id;
pthread_cleanup_push(&some_class::cleanup_thread, data_ptr);