在析构函数中pthead_join()类成员变量线程是否明智?

时间:2011-08-25 18:25:05

标签: c++ multithreading posix

我需要创建一个应该在类存在的持续时间内运行的线程。线程应该与类一起销毁。使用这种通用设计(加入析构函数)进行编码是否明智?我应该使用分离的线程吗?

class A {
    public:
        A()  { pthread_create(m_thread, ...); }
        ~A() { pthread_join(m_thread, ...);   }

    private:
        pthread_t m_thrad;
};

最后,我可以使用成员函数来生成线程,还是必须是静态或全局函数?

2 个答案:

答案 0 :(得分:4)

如果从线程中访问A类中的数据,则必须将其加入析构函数中。一个分离的线程否则会在它被销毁之后访问类数据,这只是未定义的行为。

您的线程功能必须是静态的或全局的。但是你可以将你的类'this指针作为arg参数传递给pthread_create并将static_cast传递回你的线程main函数并在你的类上调用一个普通的方法。所以你有一个非常纤薄的静态功能:

class X {
  public:
    X() {
      pthread_create(m_thread, 0, ThreadStart, this);
    }
  private:
    static void *ThreadStart(void *arg) {
      static_cast<X *>(arg)->ThreadMain();
      return 0;
    }
    void ThreadMain() {
    }
    .
    .
    .
};

答案 1 :(得分:0)

我认为这取决于A类的内容。如果您确定线程将在A类的实例死后很快退出,那么我猜您可以使用分离的线程。否则我认为你应该通知线程它应该退出并等待它这样做。