线程函数参数的前向声明不起作用

时间:2017-07-13 05:38:31

标签: c++ multithreading forward-declaration

我正在尝试为将执行RAII的类编写示例程序,并将使用self this指针调用该线程。但是线程函数参数的数据类型被声明为前向声明。 请看一下示例程序 -

#include <iostream>
#include <thread>

using namespace std;

class test; // **forward declaration**

void thfunc (test *p) {
    cout << p->value << endl;
    return;
}

class test {
    public:
        int value;
        thread t1;
        test () {
            value = 100;
            t1 = thread(thfunc, this);
        }
        ~test() {
            t1.join();
        }
};

int main () {
    test * p = new test;
    delete p;
    return 0;
}

这是一个编译错误 -

fwd.cpp: In function 'void thfunc(test*)':
fwd.cpp:9:11: error: invalid use of incomplete type 'class test'
fwd.cpp:6:7: error: forward declaration of 'class test'

要解决这个问题,我将线程函数作为类的静态成员函数 -

class test {
    public:
        int value;
        thread t1;
        test () {
            value = 100;
            t1 = thread(thfunc, this);
        }
        ~test() {
            t1.join();
            cout << "Dtor" << endl;
        }
        **static** void thfunc (test *p) {
            cout << p->value << endl;
            return;
        }

};

这是正确的解决方法吗?我想将线程函数作为单独的库,但现在我必须将它们作为类的一部分。请建议。任何类型的帮助/指针/建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

使thfunc成为静态成员是正确的,因为它将起作用。如果你想将它们分开是有原因的(有时有很好的理由),那么你仍然可以这样做。

这个函数只能在作为std::thread的参数传递之前声明:

#include <iostream>
#include <thread>

using namespace std;

void thfunc (class test *p);

class test {
    public:
        int value;
        thread t1;
        test () {
            value = 100;
            t1 = thread(thfunc, this);
        }
        ~test() {
            t1.join();
        }
};

void thfunc (test *p) {
    cout << p->value << endl;
    return;
}

int main () {
    test * p = new test;
    delete p;
    return 0;
}