увеличить поток и присоединиться - PullRequest
3 голосов
/ 25 декабря 2009

У меня есть этот тестовый пример, который компилируется с g ++ theFile.cc -lboost_thread. При запуске программы, кажется, зависает команда соединения. Я не совсем уверен, почему. Это похоже на то, что функция interrupt_point () не получает запрос на соединение от основного потока.

#include <iostream>
#include <stdio.h>
#include <signal.h>
#include <fstream>
#include <boost/thread.hpp>

using namespace std;


//////////////////////////////////

  class SerialnIMU {
  public:
    ~SerialnIMU();

    void start();
    void stop();
  private:
    boost::thread readThread;

    class SerialReader {
    public:

      void operator()();
    private:
    };
  };

////////////////////////////////


SerialnIMU::~SerialnIMU() {
  stop();
}

void SerialnIMU::start() {
  readThread = boost::thread(SerialReader());
  cout<<"Created: "<<readThread.get_id()<<endl;
}

void SerialnIMU::stop() {
  cout<<"Join: "<<readThread.get_id()<<endl;
  cout<<"Joining serial thread..."<<endl;
  readThread.join();
  cout<<"Done."<<endl;
}

//////////////////////serial thread//////////////////

void SerialnIMU::SerialReader::operator()() {
  cout<<"Serial reading thread started..."<<endl;
  try {
    while(true) {
      boost::this_thread::interruption_point();
    }
  } catch(...) {
    cout<<"exception was thrown."<<endl;
  }
  cout<<"Serial reading thread stopped."<<endl;
}


int main(int argc, char **argv) {

  SerialnIMU imu;

  imu.start();
  imu.stop();
  return 0;
}

спасибо за чтение.

РЕДАКТИРОВАТЬ: также, если вы удалите цикл while, программа выйдет чисто ... boost версии 1.39.0

Ответы [ 2 ]

2 голосов
/ 25 декабря 2009

Похоже, что ваша функция остановки на самом деле не прерывает поток. Вызов соединения не подразумевает прерывание, вместо этого вы должны сделать это явно, вызывая .interrupt () перед присоединением, если вы хотите прервать, а не ждать нормального завершения.

1 голос
/ 25 декабря 2009

Поток может перехватить исключение прерывания и продолжать обработку бесконечно долго. Чтобы прерывание было окончательным, исключение должно оставаться необработанным, или вы можете перехватить и остановить обработку, или вы можете использовать что-то более разрушительное, например, TerminateThread или pthread_cancel, которые не всегда выполняют всю очистку.

Обратите внимание, что поток может отключить прерывания с помощью boost :: this_thread :: disable_interrupt.

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