将类的成员函数传递给pthread_cleanup_push()时没有匹配的函数调用

时间:2014-01-29 15:26:28

标签: c++

当我尝试将我的功能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()

1 个答案:

答案 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);
相关问题