游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: lanlan

引用计数要用mutex来保证线程安全么

[复制链接]

14

主题

118

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2007-8-31 13:17:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

答案当然是不行,因为--ref与if(ref)是两条语句。那么就有可能会在中间出现线程切换。
考虑
线程1 执行 --ref;(切换)
线程2 执行 --ref; if (!ref) delete this; (切换)
线程1 执行 if (!ref) delete this;
则有可能出现delete 多次的情况。

另外,我不知道这样的代码行不行?不行的话可以告诉我为什么吗?
int t = ref;
--ref;
--t;
if ( !t ) delete this;

14

主题

118

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2007-8-31 13:21:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

自动指针?是指 智能指针吗?
不行的啦,智能指针用的也是引用计数呀。

14

主题

118

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2007-8-31 13:28:00 | 显示全部楼层

Re: Re: 引用计数要用mutex来保证线程安全么

FantasyDR: Re: 引用计数要用mutex来保证线程安全么

要的……

dec()
--numRef
if(numRef)

//如果执行到这里,另外一个线程使用了inc(),就不同步了。
...

我认为inc的情况应该可以不做考虑,因为如果在有inc()的情况。因该至少ref>2。
因为要赋值的另一端拥有1个ref.再加上你这边要删除的ref,所以至少有2个ref。

6

主题

42

帖子

47

积分

注册会员

Rank: 2

积分
47
发表于 2007-8-31 14:32:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

要的,不过不需要mutex,用InterlockedIncrement和InterlocedDecrement函数足矣

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2007-8-31 15:08:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

那个t,说不定会被编译器优化掉.恩.我也不清楚.只是觉得没有用mutex那么肯定.

我还没想清楚.你说的那个确实会发生!2个线程,2个指针,同时释放.

另外书上说就是是++,也不是单个指令.包括,读内存,到寄存器,写内存.

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2007-8-31 15:10:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

InterlockedIncrement和InterlocedDecrement
计算用这个也没用吧.因为
--,和if判断,涉及到2个语句了.就是这个玩意有3个地方用了.
同时,我想不依赖m$

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2007-8-31 16:59:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

我看了gtk里面的gobject的实现.
他里面他自己实现了g_atomic_int_exchange_and_add 这些...好麻烦啊

21

主题

230

帖子

230

积分

中级会员

Rank: 3Rank: 3

积分
230
 楼主| 发表于 2007-8-31 17:01:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

现在就是找有没有现成的跨平台的 g_atomic_int_exchange_and_add这些的实现了.

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
发表于 2009-11-16 21:44:00 | 显示全部楼层

Re: 引用计数要用mutex来保证线程安全么

那个++、--不是一条指令就能完成的,所以多线程的话肯定要加锁啦,要不然结果就不正确。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-18 01:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表