Объекты не могут должным образом удалить себя таким образом.
Когда поток завершается, объект 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.