C++ 从类运行方法的Pthread实例变量
我正在尝试设计一个活动对象,它一旦创建,基本上运行在它自己的线程中。到目前为止,我所做的是创建一个包含pthread实例变量的类,然后在该类的构造函数中,它应该发送pthread 由于pthread_create()接受函数参数,因此我将在类实现文件中为其传递一个run()函数 到目前为止,我的run()函数不是类的一部分,它只是放在实现文件中,但是当我试图编译它时,我得到一个错误,它说:C++ 从类运行方法的Pthread实例变量,c++,multithreading,oop,class,pthreads,C++,Multithreading,Oop,Class,Pthreads,我正在尝试设计一个活动对象,它一旦创建,基本上运行在它自己的线程中。到目前为止,我所做的是创建一个包含pthread实例变量的类,然后在该类的构造函数中,它应该发送pthread 由于pthread_create()接受函数参数,因此我将在类实现文件中为其传递一个run()函数 到目前为止,我的run()函数不是类的一部分,它只是放在实现文件中,但是当我试图编译它时,我得到一个错误,它说: "error: ‘run’ was not declared in this scope" 现在我理解了
"error: ‘run’ was not declared in this scope"
现在我理解了函数run()超出范围的原因,但是将run()作为私有函数添加到我的活动对象类中是正确的,还是如果存在多个这样的对象会导致其他问题?见鬼,如果只实例化其中一个,会不会导致问题
好的,这是代码,我只是觉得没什么关系。这是MyClass.hpp
class MyClass {
private:
pthread_t thread;
ObjectManager *queue;
int error;
// just added this, but the compiler still doesn't like it
void *run(void *arg);
public:
MyClass();
~MyClass();
void start();
}
下面是实现MyClass.cpp:
#include "MyClass.hpp"
void MyClass::start() {
if (queue == NULL)
return;
int status = pthread_create(&thread, NULL, run, (void *) queue);
if (status != 0) {
error = status;
return;
}
}
void *MyClass::run(void *arg) {
bool finished = false;
while (!finished) {
// blah blah blah
}
return NULL;
}
编译问题可能是在构造函数中引用了实现文件后,在实现文件中定义了
run
。将run
的定义移动到构造函数之前,或在构造函数之前插入run
的声明
至于让它成为不能作为
pthread\u create
工作的类成员的问题,您正在寻找一个非成员函数。您可以将其作为类的静态方法,但在决定这样做是否安全之前请先阅读(现在您知道如何使用原始函数,不需要阅读)。请显示代码,否则将很难提供任何帮助OK,只是尝试将其作为类函数添加,由于类型不匹配,它将无法编译。它正在寻找void()(void*),并且正在获得void(MyClass::)(void)。可能是简单的副本,谢谢。我不知道为什么我会错过这个,但是谢谢你。这个问题已经被问了很多次了。“静态成员函数总是出现,但它始终是错误的。@Martin-我作为第二次尝试添加的成员函数,第一次完全按照Troubadour所说的那样出现了故障。我知道为什么第二种方法在报告错误后不起作用。@Roflha:阅读上面的问题。使用静态成员函数作为pthreads的回调是不可移植的,因此不应该这样做。马丁:谢谢你指出类静态方法的问题。我不知道。