gpt4 book ai didi

c++ - pthread_create 参数函数指针

转载 作者:行者123 更新时间:2023-11-30 02:07:28 25 4
gpt4 key购买 nike

我试图在下面的代码中创建一个线程,但是指向 pthread_create 方法调用的函数参数的指针不允许我编译我的代码。

请让我知道我做错了什么以及如何在以下代码中修复它:

#include "RobotNodes.cpp"

int main(int argc, char** argv){

int i, numRobotsToInit = 7;

//declare run function pointer
void (*run)();

//create array of robot nodes
RobotNodes* robots[numRobotsToInit];

//init robot nodes
for(i = 0; i<numRobotsToInit; i++){
robots[i] = new RobotNodes(i, 0.2, 0.2);
}


for(i = 0; i<numRobotsToInit; i++){
run = &robots[i]->run;
pthread_t thread;
pthread_create(&thread, NULL, (void*(*)(void*))run, NULL);
}
}

我得到的错误如下: 错误:左值需要作为一元“&”操作数

编辑:run() 是 RobotNodes.cpp 类中的一个方法,包含在此类的顶部。

最佳答案

RobotNodes 类中似乎有一个non-static 成员函数,您似乎认为该成员函数的类型是void (*) ()。如果是这样,那你就错了。

非静态成员函数和自由函数的类型不同,即使它们具有完全相同的签名!

所以我建议您定义一个名为start 的静态函数,如下所示:

class RobotNodes
{
public:
void run(); //define it as you like

static void* start(void *pdata)
{
RobotNodes *robot = static_cast<RobotNodes*>(pdata);
robot->run(); //forward it
return 0; //or return as the documentation says
}
};

然后使用 start 作为:

std::vector<pthread_t> threads(numRobotsToInit);
for(i = 0; i<numRobotsToInit; i++)
{
pthread_create(&threads[i], NULL, RobotNodes::start, &robots[i]);
}

另外,请注意我在循环外创建了一个 pthread_t vector ;这是因为每个线程实例如果是不同的线程就必须是不同的,而且即使在循环停止后每个线程实例也必须继续存在

关于c++ - pthread_create 参数函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820653/

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