我在提神自我修养

2018-10-02 17:43:01 +08:00
 zhangZMZ

有人能懂?

2060 次点击
所在节点    问与答
18 条回复
jtsai
2018-10-02 17:46:56 +08:00
头像好评
tommy94
2018-10-02 17:53:21 +08:00
标题有错别字吗?
Fighting4Dream
2018-10-02 17:58:59 +08:00
有好处。乔布斯当年经常冥想。
delectate
2018-10-02 18:42:44 +08:00
大家不用担心,楼主只是进入了贤者时间。
zhangZMZ
2018-10-02 19:40:51 +08:00
没人看程序员的自我修养吗?
在 29 页:
volatile T* pIntst =0;

T* GetInstance()
{
if (pInst == NULL)
{
lock();
if( pInst == NULL)
{
pInst = new T;
unlock();
}
return pInst;
}
}
zhangZMZ
2018-10-02 19:41:41 +08:00
上面为什么说 2 个 if 让 lock 的调用开销降低到了最小。
zek
2018-10-02 19:42:52 +08:00
随着身体一阵抖动,一切都变得索然无味?
zhangZMZ
2018-10-02 19:46:50 +08:00
@zek g u n
iiduce
2018-10-02 19:50:31 +08:00
声色虽云属少年,稍知撙节乃无愆。
关精息气宜闻早,莫使羽苞火中燃。
zhangZMZ
2018-10-02 19:53:05 +08:00
@iiduce 真 tmd 的人才
coderluan
2018-10-02 20:11:59 +08:00
那书挺好的,看不进去编译原理和 linkers and loaders 的都可以看看。

PS:楼主不想别人回复的莫名其妙,就别把标题和正文写的莫名其妙。
shpdnx
2018-10-03 05:52:43 +08:00
在做义工吗?
医院有义工。福利院有义工。寺庙有义工。
ryd994
2018-10-03 07:07:58 +08:00
@zhangZMZ 第一个 if 筛掉已经在忙的情况,避免没必要的抢锁,第二个 if 保证安全。
另外你这个代码有问题,万一抢到了锁,但 plnst 不空,那 unlock 也跳过了,就会死锁。
zhangZMZ
2018-10-03 13:55:52 +08:00
@ryd994 可否进一步探讨?
zhangZMZ
2018-10-03 14:21:38 +08:00
@ryd994 第一个 if 筛掉已经在忙的情况,避免没必要的抢锁,第二个 if 保证安全。
第二个 if 保证安全?
ryd994
2018-10-03 15:43:05 +08:00
@zhangZMZ 你这个看起来是个单例模式
那这个变量要么 null,要么初始化之后就不会再变
如果不考虑性能,安全的写法是
锁,检查,如果空就初始化
但是这样的话就每次都要锁,对这个变量的访问只能单线程
所以加一个优化,先看看是不是空,不空就直接用了,不需要再初始化也不需要加锁
第二个 if 还是不可以去掉,因为第一个 if 可能遇到 race condition
zhangZMZ
2018-10-03 16:46:52 +08:00
@ryd994 问题有 2 点:
1 没明白 race condition,因为如果是资源竞争那么第一个 if 和 lock 就足以解决问题了;
2 在程序员的自我修养的第 29 页写的是“ 2 个 if 能最大的降低 lock 的调用开销”,第一个 if 的作用我能理解,关键是第 2 个 if,它如何降低开销的?
zhangZMZ
2018-10-03 18:49:47 +08:00
既然都加锁了为何还会引起资源竞争?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/494599

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX