Указатель с областью действия для ускорения потока

Сегодня я хочу использовать boost :: scoped_ptr, чтобы указать на boost :: thread.

В моем Thread.h у меня есть boost::scoped_ptr<boost::thread> m_thread, а в моем Thread.cpp есть функция create(), в которой должно происходить создание boost :: thread. Я пробовал Thread::m_thread (new boost::thread(attr, boost::bind(%Thread::run, this)));, но неудивительно, что это не сработало.

Я не могу понять сам (или используя документацию по boost), как бы это сделать, так как я не совсем понимаю, что происходит с scoped_ptr и как он работает. Раньше я использовал необработанный указатель, который работал нормально, но сейчас мне не разрешено его использовать.

Спасибо за ваше время!


person DenverCoder21    schedule 28.08.2013    source источник


Ответы (1)


Я не знаю, какая у вас ошибка, попробуйте следующее:

class Thread {
 public:
  Thread() : thread_(new boost::thread(boost::bind(&Thread::run, this))) {
  }

  void run() {
  }

  ~Thread() {
    thread_->join();
  }

 private:
  boost::scoped_ptr<boost::thread> thread_;
};

int main() {
  Thread thread;
}

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

person Community    schedule 29.08.2013
comment
Это в значительной степени то, что я пробовал, и то, что указано в моем вопросе, если я что-то не упускаю. ;) Моя ошибка связана с определением m_thread, и в нем говорится: ошибка C2064: термин не оценивает функцию, принимающую 1 аргумент Это касается строки с Thread::m_thread(new boost::thread(attr, boost::bind(&Thread::run, this))); - person DenverCoder21; 29.08.2013
comment
Привет, m_thread объявлен в Thread.h и вызывается create() функцией в Thread.cpp. Однако проблема (скорее всего) заключалась в том, что после создания объекта потока m_thread уже внутренне определен со значением по умолчанию и, следовательно, не может быть перезаписан в функции create(). Я создаю еще один scoped_ptr с именем tmp в create() и назначаю ему свой boost::thread, затем меняю его местами на m_thread и автоматически уничтожаю, когда он выходит из области видимости после завершения create(). Возможно, это не самое красивое занятие, но для меня работает. Спасибо за вашу помощь! - person DenverCoder21; 29.08.2013