社区
C++ 语言
帖子详情
使用引用计数器的线程安全问题
begges
2010-08-17 02:13:33
网上看到一篇文章说stl中的string使用引用计数器和写时复制技术。但也有一篇文章说这种做法存在线程安全问题:http://blog.csdn.net/blade2001/archive/2007/03/27/1542392.aspx
而java中的堆上的对象也使用引用计数,那是怎么避免线程安全问题的?
...全文
553
11
打赏
收藏
使用引用计数器的线程安全问题
网上看到一篇文章说stl中的string使用引用计数器和写时复制技术。但也有一篇文章说这种做法存在线程安全问题:http://blog.csdn.net/blade2001/archive/2007/03/27/1542392.aspx 而java中的堆上的对象也使用引用计数,那是怎么避免线程安全问题的?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fallening
2010-08-18
打赏
举报
回复
计数为0就行了
begges
2010-08-18
打赏
举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]
Java早期是使用引用计数的,现在都不用了。现在的GC机制都是按照代龄进行的垃圾回收。
就是因为引用计数机制有Lock的问题。所以现在普遍不用了。
而C++的String早期用引用计数,而COW技术,都是为了节省内存。
而现在,内存没有那么贵了,技术上也就不吝惜了。
我写了三篇关于GC的blog,可以看看。
http://www.cnblogs.com/healerkx/cate……
[/Quote]
那JVM是怎么判断某块儿内存已经不被引用,可以回收了呢?
chenyu2202863
2010-08-18
打赏
举报
回复
正如甘草所言,string如果用了COW技术,将导致严重的运行开销问题。在More Effective C++和More Exceptional C++上有叙述。
「已注销」
2010-08-18
打赏
举报
回复
其实也可以自己写,
嵌入指令xadd加lock前缀
lock xadd m32, r32
比如 lock xadd refc, ebx
xadd指令将内存refc中的值与ebx中的值相加,结果放入eax中,加lock前缀,与地址总线同步,并加栅障,导致原子性。
注意,refc变量一般要加volatile修饰,因为一般写值加lock前缀,而读值的时候,可以直接读,此时应加栅障,到达处理器缓冲同步。加volatile修饰默认加了栅障。 除此之外,也可以用加lock前缀,加数写0的方式读出内容,但显然没有直接读效率高。
「已注销」
2010-08-18
打赏
举报
回复
引用计数要线程安全,用interlock就可以了
加1用InterlockedIncrement (windows)
减1用InterlockedDecrement (windows)
一般在Release中这样判断,
if( InterlockedDecrement( &this->refc ) == 0 )
delete this;
herman~~
2010-08-17
打赏
举报
回复
mark 学习
pengzhixi
2010-08-17
打赏
举报
回复
首先string 早于STL出现,另外就是string 是否采用引用计数和写时复制也没有规定,看具体实现吧
healer_kx
2010-08-17
打赏
举报
回复
[Quote=引用 3 楼 taodm 的回复:]
引用计数的修正方法,去看boost::shared_ptr的源码,要之:锁无关编程
[/Quote]
学习了。
search 去~
taodm
2010-08-17
打赏
举报
回复
引用计数的修正方法,去看boost::shared_ptr的源码,要之:锁无关编程
healer_kx
2010-08-17
打赏
举报
回复
Java早期是使用引用计数的,现在都不用了。现在的GC机制都是按照代龄进行的垃圾回收。
就是因为引用计数机制有Lock的问题。所以现在普遍不用了。
而C++的String早期用引用计数,而COW技术,都是为了节省内存。
而现在,内存没有那么贵了,技术上也就不吝惜了。
我写了三篇关于GC的blog,可以看看。
http://www.cnblogs.com/healerkx/category/171828.html
PS,OO相关的,也可以看看:
http://www.cnblogs.com/healerkx/category/136925.html
healer_kx
2010-08-17
打赏
举报
回复
目前的stl实现,基本都是非引用计数实现了。
你想研究这个问题。可以研究CComBSTR,这几个BSTR相关的类型。
理论上都是一样的。
C++
计数器
类(单例、
线程安全
)
思路: 1.
使用
单例保证
计数器
类全局
引用
唯一; 2.
使用
范围锁确保多线程并发
引用
计数器
的准确性; 3.
使用
unsigned __int64类型作为
计数器
的类型。当
计数器
到达ULLONG_MAX(类型最大值)时,复位重新技术,并将循环计数。确保
使用
的
计数器
数量可计算。 代码: 1. SNGenertor.h 其中,调用NewSNGenertor接口为创建计算器类。其中,min为
计数器
起始值,max我计算器最大值(当为0时为ULLONG_MAX)。日常
使用
直接调用Get接口即可。 #pra
Java多线程-----
线程安全
问题
(详解)
Java多线程-----
线程安全
问题
(详解)
线程实现
计数器
功能c语言,利用 C++ 11 特性实现多线程
计数器
许多并行计算程序,需要确定待计算数据的编号,或者说,多线程间通过编号而耦合。此时,通过利用C++ 11提供的atomic_?type类型,可实现多
线程安全
的
计数器
,从而,降低多线程间的耦合,以便于书写多线程程序。以
计数器
实现为例子,演示了多线程
计数器
的实现技术方法,代码如下://目的: 测试利用C++ 11特性实现
计数器
的方法//操作系统:ubuntu 14.04//publish_date: 2...
【JavaEE初阶 — 多线程】
线程安全
问题
& synchronized
【JavaEE初阶 — 多线程】
线程安全
问题
& Synchronized 观察
线程安全
问题
,分析了造成
线程安全
问题
造成的三个原因:线程的随机调度,多个线程修改共享数据(修改同一个变量),以及原子性
问题
,并讲述了如何解决这三种原因引发的线程不安全;并讲述了 synchronized 互斥 和 可重入 的特性,并给出了 synchronized的
使用
案例;简单介绍了Java标准库中的
线程安全
类和线程不安全类。
智能指针
线程安全
shared_ptr的
引用
次数加减操作内部自动加锁解锁,是
线程安全
的。但是指向对象的指针不是
线程安全
的。一、
使用
智能指针访问资源不是
线程安全
的,需要手动加锁解锁。再使
引用
次数加减操作,虽然
引用
次数加减是原子操作,二、智能指针的拷贝也不是
线程安全
的。但是指针拷贝和
引用
次数两步操作。并不是原子操作,线程不安全,首先拷贝指向对象的指针,智能指针的赋值拷贝,
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章