线程上的共享指针在连接后计数为1
Shared Pointer on a thread counts 1 after join?
有一个等待线程完成的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.
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 当套接字连接断开时检测C/C++Unix
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 无法在windows上使用mingw将sqlite3与c连接
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 到连接组件算法的问题(递归)
- 无法在Ubuntu上将共享库与Eclipse链接
- 是否有 Windows 用户空间函数来枚举连接的网络共享?
- 在QT中的两个窗口之间共享websocket连接
- 如何从连接到共享打印对象的客户端的服务器获取所有IP(或用户名)
- 具有共享边界的最小连接区域的图论算法
- 线程上的共享指针在连接后计数为1
- 两个对象内部的共享指针相互连接
- OpenCv错误在C包装为imread: QNativeImage:无法连接到共享内存段