Лучший способ запустить поток как член класса C ++?

StackOverflow https://stackoverflow.com/questions/86046

  •  01-07-2019
  •  | 
  •  

Вопрос

Мне интересно, что Лучшие способ запустить pthread, который является членом класса C ++?В качестве ответа следует мой собственный подход...

Это было полезно?

Решение

Обычно я использую статическую функцию-член класса и использую указатель на класс в качестве параметра void *.Затем эта функция может либо выполнять обработку потока, либо вызывать другую нестатическую функцию-член со ссылкой на класс.Затем эта функция может ссылаться на всех членов класса без неудобного синтаксиса.

Другие советы

Это можно просто сделать, используя библиотеку boost, например, так:

#include <boost/thread.hpp>

// define class to model or control a particular kind of widget
class cWidget
{
public:
void Run();
}

// construct an instance of the widget modeller or controller
cWidget theWidget;

// start new thread by invoking method run on theWidget instance

boost::thread* pThread = new boost::thread(
    &cWidget::Run,      // pointer to member function to execute in thread
    &theWidget);        // pointer to instance of class

Примечания:

  • При этом используется обычная функция-член класса.Нет необходимости добавлять дополнительные статические элементы, которые сбивают с толку ваш интерфейс класса
  • Просто включите boost/thread.hpp в исходный файл, с которого вы запускаете поток.Если вы только начинаете с boost, все остальное в этом большом и пугающем пакете можно игнорировать.

В C ++ 11 вы можете сделать то же самое, но без boost

// define class to model or control a particular kind of widget
class cWidget
{
public:
void Run();
}

// construct an instance of the widget modeller or controller
cWidget theWidget;

// start new thread by invoking method run on theWidget instance

std::thread * pThread = new std::thread(
    &cWidget::Run,      // pointer to member function to execute in thread
    &theWidget);        // pointer to instance of class

Вы должны загрузить его, используя параметр void *:

class A
{
  static void* StaticThreadProc(void *arg)
  {
    return reinterpret_cast<A*>(arg)->ThreadProc();
  }

  void* ThreadProc(void)
  {
    // do stuff
  }
};

...

pthread_t theThread;
pthread_create(&theThread, NULL, &A::StaticThreadProc, this);

Я использовал три из описанных выше метода.Когда я впервые использовал многопоточность в c ++, я использовал статические функции-члены, тогда функции друзей и, наконец, РАСШИРЯЙТЕ библиотеки.В настоящее время я предпочитаю BOOST.За последние несколько лет я стал настоящим фанатиком БУСТИНГА.

BOOST относится к C ++ так же, как CPAN - к Perl.:)

Библиотека boost предоставляет механизм копирования, который помогает перенести информацию об объекте в новый поток.В другом примере boost boost::bind будет скопирован с помощью указателя, который также просто копируется.Таким образом, вам придется позаботиться о достоверности вашего объекта, чтобы предотвратить зависание указателя.Если вы реализуете operator() и предоставляете вместо этого конструктор копирования и передаете объект напрямую, вам не нужно заботиться об этом.

Гораздо более приятное решение, которое предотвращает множество неприятностей:

#include <boost/thread.hpp>

class MyClass {
public:
        MyClass(int i);
        MyClass(const MyClass& myClass);  // Copy-Constructor
        void operator()() const;          // entry point for the new thread

        virtual void doSomething();       // Now you can use virtual functions

private:
        int i;                            // and also fields very easily
};

MyClass clazz(1);
// Passing the object directly will create a copy internally
// Now you don't have to worry about the validity of the clazz object above
// after starting the other thread
// The operator() will be executed for the new thread.
boost::thread thread(clazz);             // create the object on the stack

В другом примере boost создается объект thread в куче, хотя делать это нет смысла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top