gpt4 book ai didi

C++:如何将类方法定义为线程的启动例程(使用 pthread 库)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:57 24 4
gpt4 key购买 nike

我有一个Base 类和一个Derived 类。他们有一个虚函数——virtual void action()我如何将它传递给 *pthread_create()* 函数?

示例(有错误):

class Base{
protected:
pthread_t tid;
public:
virtual void* action() = 0;
};

class Derived : public Base{
void* action();
Derived(){
pthread_create(&tid, NULL, &action, NULL);
}
};

也许它应该是静态的?我尝试了很多组合,但找不到解决方案..

最佳答案

几个月前,我在从事高级设计项目时遇到了这个问题。它需要一些底层 C++ 机制的知识。

潜在的问题是指向函数的指针不同于指向成员函数的指针。这是因为成员函数有一个隐含的第一个参数,this

来自 man 页面:

int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);

线程入口点是一个void* (*)(void*)。您的函数 Base::action 的类型为 void* (Base::*)()。该丑陋类型声明的 Base:: 部分表示 this 的类型。类型差异是编译器不接受您的代码的原因。

要使这项工作正常进行,我们需要解决两件事。我们不能使用成员函数,因为指向成员函数的指针不会将 this 绑定(bind)到实例。我们还需要一个 void* 类型的参数。值得庆幸的是,这两个修复是齐头并进的,因为解决方案是我们自己显式传递 this

class Base {
public:
virtual void* action() = 0;

protected:
pthread_t tid;

friend void* do_action(void* arg) {
return static_cast<Base*>(arg)->action();
}
};

class Derived : public Base {
public:
Derived() {
// This should be moved out of the constructor because this
// may (will?) be accessed before the constructor has finished.
// Because action is virtual, you can move this to a new member
// function of Base. This also means tid can be private.
pthread_create(&tid, NULL, &do_action, this);
}

virtual void* action();
};

编辑:糟糕,如果 tidprotectedprivate,那么 do_action 需要成为 friend

关于C++:如何将类方法定义为线程的启动例程(使用 pthread 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809987/

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