gpt4 book ai didi

c++ - 错误 : argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void*)’

转载 作者:太空宇宙 更新时间:2023-11-04 15:22:18 28 4
gpt4 key购买 nike

我正在使用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*)’ 发生了。我的代码有什么问题?

提前致谢:)

最佳答案

正是编译器告诉您的内容。

pthread_create 需要一个带有签名的函数:

无效* (*)(无效*)

这是一个函数指针。

但是,您提供的是带有此签名的内容:

void* (线程::)(void*)

不是函数指针,而是指向成员函数的指针。有一个区别:指向成员函数的指针需要一个对象的实例才能正常工作(在这里,它需要一个 Thread 的实例)。

通常的解决方案是使您的函数 run static :它将不再是成员函数 - 它不需要 Thread 的实例来执行可以正常工作了,您可以将当前实例作为 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();
}

关于c++ - 错误 : argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void*)’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16049640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com