线程上的共享指针在连接后计数为1

Shared Pointer on a thread counts 1 after join?

本文关键字:连接 共享 指针 线程      更新时间:2023-10-16

有一个等待线程完成的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
}

那么,这个计数何时被设为0 ?我假设,在join之后,一个线程完成了。但是什么时候呢?

use_count()只是告诉您有多少个shared_ptr对象指向同一个boost::thread对象。它与线程是否终止无关。

mThread超出作用域时,计数器将自动递减。

如果不再需要thread对象,可以调用mThread.reset()。这也会导致mThread.use_count()变为0

对象不能像那样正确地删除自己。

当线程终止时,表示它的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.