- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个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();
};
编辑:糟糕,如果 tid
是 protected
或 private
,那么 do_action
需要成为 friend
。
关于C++:如何将类方法定义为线程的启动例程(使用 pthread 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809987/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!