关于c ++:Pthread实例变量从类运行方法

Pthread instance variable running methods from class

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

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

到目前为止,我的run()函数不是类的一部分,它只是位于实现文件中,但是当我试图编译它时,我得到一个错误消息说:

1
"error: ‘run’ was not declared in this scope"

现在我明白了为什么函数run()超出了作用域,但是将run()作为私有函数添加到活动对象类中是正确的,还是如果存在多个这样的对象会导致其他问题?见鬼,它会不会只实例化其中一个就产生问题?

好的,这是代码,我只是觉得没什么关系。这是myclass.hpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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之后,在您的实现文件中定义了它。要么将EDOCX1的定义移动到构造函数之前,要么将EDOCX1的声明插入到构造函数之前。

至于您的问题,使它成为一个类成员,而不工作,因为pthread_create正在寻找一个非成员函数。您可以在类中使用静态方法,但是在C++中读取,对于C API回调,使用静态成员函数指针是安全的/便携的吗?在决定你这样做是否安全之前(现在你不需要知道如何使用你原来的功能)。