Shared Pointer для потока считается 1 после объединения? - PullRequest
0 голосов
/ 21 сентября 2011

Имея boost::condition_variable, который ожидает завершения потока:

boost::condition_variable mContd;
boost::shared_ptr<boost::thread> mThread;

Представьте себе, поток был запущен некоторое время назад, и теперь ждите:

if(!mContd.timed_wait(tLock, boost::posix_time::seconds(1))) {
  // cancel thread if deadline is reached
  mThread.interrupt();
  mThread.join();

  std::cout 
    << "Thread count = " 
    << mThread.use_count() // still prints '1'
    << std::endl;

} else {
  // continue
}

Итаккогда этот счетчик установлен на ноль?Я предположил, что после join поток закончен.Но когда это?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

use_count() просто говорит вам, сколько shared_ptr объектов указывает на один и тот же boost::thread объект.Это не имеет никакого отношения к тому, завершился ли поток.

Счетчик автоматически уменьшится, когда mThread выйдет за пределы области.

Если вам больше не нужен объект threadВы могли бы позвонить mThread.reset().Это также заставит mThread.use_count() опуститься до нуля.

1 голос
/ 21 сентября 2011

Объекты не могут должным образом удалить себя таким образом.

Когда поток завершается, объект boost::thread, представляющий его, переходит в «законченное» состояние, но он все равно должен «существовать», поскольку shared_ptr контролирует его. У вас все еще есть один, теперь «законченный» boost::thread объект, который у вас был раньше, поэтому счетчик все еще равен 1.

Фактически, в общем случае boost::shared_ptr::use_count() будет только возвращать 0, когда он представляет «нулевой указатель», а не реальный существующий объект.

Следует прямая аналогия:

boost::thread mThread(&f); // Create thread object

mThread.interrupt();
mThread.join();            // Thread is now "finished"

cout << (mThread.get_id() == boost::thread::id());
// ^ Outputs `true`, because the object mThread is now in the
//   not-a-thread state, but of course it still must exist.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...