Pthread实例变量从类运行方法

时间:2011-06-19 21:51:13

标签: c++ multithreading oop class pthreads

我正在尝试设计一个曾经创建过的各种活动对象,基本上是在自己的线程中运行。到目前为止我所做的是创建一个包含pthread实例变量的类,然后在该类的构造函数中,它应该发送pthread。

由于pthread_create()接受一个函数参数,我将它传递给我在类实现文件中设置的run()函数。

截至目前,我的run()函数不是该类的一部分,它只是位于实现文件中,但是当我尝试编译它时,我收到一条错误说:

"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;
}

1 个答案:

答案 0 :(得分:2)

您的编译问题可能是在在构造函数中引用它之后在实现文件中定义了run。在构造函数之前移动run的定义或在构造函数之前插入run的声明。

至于你的问题,使它成为一个无法工作的类成员pthread_create正在寻找一个非成员函数。您可以在课堂上将其设为静态方法,但在决定是否安全之前阅读In C++, is it safe/portable to use static member function pointer for C API callbacks?(而不是您现在需要知道如何使用原始函数)。