Как заставить поток ждать полного разрушения объекта?(Объект также имеет один поток)? - PullRequest
0 голосов
/ 31 мая 2018

Я создаю gTEST, в котором я запустил службу с собственным потоком.Перед остановкой сервиса я создал объект класса, имеющий собственный поток.Теперь я хочу, чтобы служебный поток дождался полного разрушения объекта (поток классов выполняет его работу и завершил работу), а затем остановил служебный поток.Если я засыпаю на некоторое время, то все работает хорошо.

Test.cpp

    TEST_F(TestFixture, TestName) {

      service->start(); //Sevice is having its own thread

      // Creating the Object 
      DummyClass Obj(); //Object is having its own thread that starts on initialization 

      EXPECT_CALL(*_Mock,
                  Func(NotNull(), NotNull(), NotNull(), NotNull(), NotNull(), NotNull()))
          .Times(1)
          .WillRepeatedly(Return(1));
      EXPECT_EQ(true,
                Obj.Func1(a,b, c, d)
                    .IsOk());

      usleep(1000); //If I remove the this reason-111: Connection refused.
     service->Stop();
    }

Class.cpp

    //Destructor
    SasThreadHelper::~SasThreadHelper() {
    this->StopThread();
    }

//Called in Constructor
void SasThreadHelper::StartThread() {
  if (m_thread.get_id() != std::thread::id()) {
    return;
  }

  m_stop_thread_flag = 0;

  // spawn the thread
  m_thread = std::thread(&SasThreadHelper::ReadMessagesFromQueue, 
  this);
}

void SasThreadHelper::StopThread() {
  m_client_authenticated = 0;
  m_stop_sas_thread_flag = 1;
  m_thread.join();
}

1 Ответ

0 голосов
/ 31 мая 2018

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

class WaitOnOwnThread
{
    private:
        std::thread t;

    public:
        WaitOnOwnThread(): t{[](){
            std::cout << "Thread starts here" << std::endl;
            sleep(2); // thread is doing something
        }}
        {
        }

        ~WaitOnOwnThread()
        {
            t.join(); // wait that thread finishes
            std::cout << "Thread has finished" << std::endl;
        }
};

int main()
{
    {
        WaitOnOwnThread w;
        std::cout << "Do some things in main thread" << std::endl;
    } // end of scope for destruction of WaitOnOwnThread

    std::cout << "end of main " << std::endl;
}
...