使用引用计数器的线程安全问题

begges 2010-08-17 02:13:33
网上看到一篇文章说stl中的string使用引用计数器和写时复制技术。但也有一篇文章说这种做法存在线程安全问题:http://blog.csdn.net/blade2001/archive/2007/03/27/1542392.aspx

而java中的堆上的对象也使用引用计数,那是怎么避免线程安全问题的?
...全文
538 11 打赏 收藏 转发到动态 举报
写回复
用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相关的类型。
理论上都是一样的。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧