3

我有一个名为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 )'*

4

2 回答 2

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);
于 2013-06-24T00:39:11.690 回答
0

你可以在这里找到答案。

您应该使用静态函数传递给 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);
于 2013-06-24T00:38:09.750 回答