社区
C++ 语言
帖子详情
使用引用计数器的线程安全问题
begges
2010-08-17 02:13:33
网上看到一篇文章说stl中的string使用引用计数器和写时复制技术。但也有一篇文章说这种做法存在线程安全问题:http://blog.csdn.net/blade2001/archive/2007/03/27/1542392.aspx
而java中的堆上的对象也使用引用计数,那是怎么避免线程安全问题的?
...全文
538
11
打赏
收藏
使用引用计数器的线程安全问题
网上看到一篇文章说stl中的string使用引用计数器和写时复制技术。但也有一篇文章说这种做法存在线程安全问题:http://blog.csdn.net/blade2001/archive/2007/03/27/1542392.aspx 而java中的堆上的对象也使用引用计数,那是怎么避免线程安全问题的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
线程实现
计数器
功能c语言,利用 C++ 11 特性实现多线程
计数器
许多并行计算程序,需要确定待计算数据的编号,或者说,多线程间通过编号而耦合。此时,通过利用C++ 11提供的atomic_?type类型,可实现多
线程安全
的
计数器
,从而,降低多线程间的耦合,以便于书写多线程程序。以
计数器
实现为例子,演示了多线程
计数器
的实现技术方法,代码如下://目的: 测试利用C++ 11特性实现
计数器
的方法//操作系统:ubuntu 14.04//publish_date: 2...
jmeter之
计数器
的
使用
如果需要
引用
的数据量较大,且要求不能重复或者需要自增,那么可以
使用
计数器
来实现。
计数器
(counter):允许用户创建一个在线程组之内都可以被
引用
的
计数器
。
计数器
允许用户配置一个起点,一个最大值,增量数,循环到最大值,然后重新开始,继续这样,直到测试结束。
计数器
使用
long存储的值,所取的范围是2^63——2^63-1. 1、启动jmeter,添加线程组,右键添加配置元件——
计数器
计数器
界面如下: 启动(start):给定
计数器
的起始值、初始值,第一次迭代时,会把该值赋给
计数器
.
java多线程会造成
线程安全
问题
的原因总结
众所周知,多线程会造成
线程安全
问题
,那么多线程为什么会导致
线程安全
问题
呢? 一:首先了解jvm内存的运行时数据区 1.堆区:存储对象实例(和实例变量),数组等 2.java虚拟机栈(方法·栈),存放方法声明,局部变量,对象的
引用
变量,基本数据类型变量等 3.本地方法栈:存储一些本地方法(native关键字修饰的方法,如hashCode()方法,clone方法,Thread类的star0()方法) 4.方法区:存储类元数据,常量,静态变...
【多线程基础】 保证
线程安全
的总结
当你的才华撑不起你的野心的时候,你就应该静下心来学习!欢迎志同道合的朋友一起加油喔比个心一.
使用
没有共享资源的模型1.简化并发编程:由于不存在共享数据,线程间无需同步,这使得编程变得简单,降低了出错的风险。2.可伸缩性:由于线程之间不需要竞争共享资源,这种模型可以很好地利用多核处理器的性能,提高系统的吞吐量。3.减少锁竞争:无共享数据意味着无需
使用
锁来保护资源,从而避免了锁竞争带来的性能开销。4.易于理解:无共享数据模型不需要复杂的同步逻辑,使得代码更容易理解和维护。
C++ 语言
64,636
社区成员
250,540
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章