【问题标题】:Pthread instance variable running methods from classPthread 实例变量从类运行方法
【发布时间】:2011-06-19 21:51:12
【问题描述】:

我正在尝试设计一个活动对象,一旦创建,基本上就在自己的线程中运行。到目前为止,我所做的是创建一个包含 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;
}

【问题讨论】:

  • 请出示代码,否则很难提供任何帮助
  • 好的,刚刚尝试将其添加为类函数,由于类型不匹配而无法编译。它正在寻找 void ()(void*) 并得到 void (MyClass::)(void).
  • pthread Function from a Class 的可能重复项

标签: c++ multithreading oop class pthreads


【解决方案1】:

您的编译问题很可能是在您的实现文件中定义了run 您在构造函数中引用了它。要么将run 的定义移到构造函数之前,要么在构造函数之前插入run 的声明。

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

【讨论】:

  • 很简单,谢谢。不知道为什么我错过了,但谢谢。
  • 这个问题已经被问过很多次了。并且总是总是静态成员函数出现,但它仍然总是错误
  • @Martin - 我作为第二次尝试添加的成员函数,第一次就像 Troubadour 所说的那样出现故障。我知道为什么第二种方式在报错后没有立即生效。
  • @Roflha:阅读上面的问题。使用静态成员函数作为 pthread 的回调是不可移植的,因此是不好的做法,不应该这样做。你很幸运,它确实有效。
  • @Martin:感谢您指出类静态方法的问题。我不知道。
猜你喜欢
  • 2017-02-15
  • 2021-06-03
  • 1970-01-01
  • 2013-03-10
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多