在构造函数中使用“this”安全地启动线程?

时间:2016-05-14 13:19:38

标签: c++ multithreading

#include <pthread.h>

class C {
private:
    int a;
    pthread_t id;

    int getA() {return a;}
    static void* threadFunction(void* arg) {((C*)arg)->getA();return 0;}

public:
    C() {
        a=2;

        pthread_create(&id,NULL,threadFunction,this);
    }
    ~C() {pthread_join(id,NULL);}

};

int main(int argc, char** argv) {
    C c;
}

以上代码是安全/定义/良好实践吗?

你应该在构造函数返回后启动线程吗?

1 个答案:

答案 0 :(得分:1)

在构造函数中启动线程的具体示例没有错。线程访问的类成员已初始化。但这并不意味着它总是安全的#34;但

一个示例是具有线程调用的虚方法的类。显然,除非采取适当的步骤来确保线程不会调用虚方法,直到覆盖虚方法的最派生对象被构造出来,否则它不会安全&#34;和导致未定义的行为。

即使采取了适当的步骤,它仍然可能安全,也可能不安全,具体取决于虚拟方法的作用或不作用。

所以,正如你所看到的,它是否安全&#34;是否适用于每种情况。需要分析从构造函数开始的线程的每个特定用例,以确定它是否安全&#34;这样做。

但这与C ++的许多其他方面没什么不同。