Разумно ли использовать поток-переменную класса pthead_join () в деструкторе? - PullRequest
0 голосов
/ 25 августа 2011

Мне нужно создать поток, который должен работать в течение всего времени существования класса. Нить должна быть уничтожена классом. Было бы разумно кодировать с этим общим дизайном (присоединиться к деструктору)? Должен ли я использовать отдельный поток вместо возможно?

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

    private:
        pthread_t m_thrad;
};

Наконец, я могу использовать функцию-член для порождения потока, или это должна быть статическая или глобальная функция?

Ответы [ 2 ]

4 голосов
/ 25 августа 2011

Если вы обращаетесь к данным из вашего класса A из потока, вы должны присоединиться к ним в деструкторе.В противном случае отсоединенный поток получит доступ к данным класса после его уничтожения, что является просто неопределенным поведением.

Ваша функция потока должна быть статической или глобальной.Но вы можете передать своему классу этот указатель как параметр arg в pthread_create и static_cast вернуть его в основную функцию вашего потока и вызвать нормальный метод в вашем классе.Так что у вас очень тонкая статическая функция:

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() {
    }
    .
    .
    .
};
0 голосов
/ 25 августа 2011

Я думаю, что это зависит от класса A.Если вы точно знаете, что поток завершится через некоторое время после того, как ваш экземпляр класса A умрет, то я думаю, вы могли бы использовать отдельные потоки.В противном случае я думаю, что вы должны сообщить потоку, что он должен выйти, и ждать, пока он это сделает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...