pthread_create c ++中的转换无效

时间:2013-06-24 00:27:25

标签: c++ multithreading function-pointers

我有一个名为 qwerty 的类和一个名为 compute_ans 的函数,它接受一个void指针并返回一个void指针。现在,当我尝试编译时,以下语句抛出错误

pthread_create (thread_a, NULL, compute_ans, (void*) struct_left);

函数的定义是 void * compute_ans(void * struct_input)

错误是

  

无法将'qwerty :: compute_ans'从类型'void *(qwerty ::)(void *)'转换为'void *()(void )'*

2 个答案:

答案 0 :(得分:3)

您不能将指向非静态成员函数的指针转换为指向函数的指针,C ++不允许它。原因是成员函数将隐式this指针作为参数。从本质上讲,这会将函数的签名更改为void* compute_ans(qwerty*, void*)。为了将函数传递给pthread_create,您需要使成员函数保持静态。

class qwerty
{
public:
    // ... other member functions and variables ...

    // thread start function
    static void* compute_ans(void*);
};

如果你不能使它成为静态成员函数,你需要将指向qwerty对象的指针传递给线程启动函数。查看问题中的代码,还需要将其他数据传递给线程函数。为此,您可以使用包含所有必要数据的附加数据结构,并将指针传递给它。

class qwerty;  // forward declaration

// Structure passed to pthread_create and our helper function
struct thread_data
{
    qwerty* qptr;   // pointer to qwerty object
    void*   data;   // pointer to other data. change void to your data type.
};

class qwerty
{
public:
    // thread start function
    static void* start_compute_ans(void* param)
    {
        // get a pointer to the thread data
        thread_data* tdata = static_cast<thread_data*>(param);

        // Call the real compute_ans
        tdata->qptr->compute_ans(tdata->data);

        // Delete the data (use an appropriate smart pointer if possible)
        delete tdata;

        return NULL;
    }

    // the real 
    void compute_ans(void*)
    {
        // do stuff here
    }
};

// Create our thread startup data
thread_data* tdata = new thread_data();
tdata->qptr = qwerty_pointer;
tdata->data = struct_left;

// start the thread data
pthread_create (thread_a, NULL, &qwerty::start_compute_ans, tdata);

答案 1 :(得分:0)

您可以找到答案here

您应该使用静态函数传递给pthread。

class qwerty
{
public:
    void compute_ans(void)
    {
        std::cout << "Compute result!" << std::endl;
        return
    }

    static void hello_helper(void *context)
    {
        return ((qwerty *)context)->compute_answer();
    }
};
...
qwerty c;
pthread_t t;
pthread_create(&t, NULL, &qwerty::hello_helper, &c);