V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhangZMZ
V2EX  ›  问与答

我在提神自我修养

  •  
  •   zhangZMZ · 2018-10-02 17:43:01 +08:00 · 2167 次点击
    这是一个创建于 2274 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有人能懂?

    18 条回复    2018-10-03 18:49:47 +08:00
    jtsai
        1
    jtsai  
       2018-10-02 17:46:56 +08:00
    头像好评
    tommy94
        2
    tommy94  
       2018-10-02 17:53:21 +08:00 via Android
    标题有错别字吗?
    Fighting4Dream
        3
    Fighting4Dream  
       2018-10-02 17:58:59 +08:00 via Android
    有好处。乔布斯当年经常冥想。
    delectate
        4
    delectate  
       2018-10-02 18:42:44 +08:00
    大家不用担心,楼主只是进入了贤者时间。
    zhangZMZ
        5
    zhangZMZ  
    OP
       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
        6
    zhangZMZ  
    OP
       2018-10-02 19:41:41 +08:00
    上面为什么说 2 个 if 让 lock 的调用开销降低到了最小。
    zek
        7
    zek  
       2018-10-02 19:42:52 +08:00 via Android
    随着身体一阵抖动,一切都变得索然无味?
    zhangZMZ
        8
    zhangZMZ  
    OP
       2018-10-02 19:46:50 +08:00
    @zek g u n
    iiduce
        9
    iiduce  
       2018-10-02 19:50:31 +08:00
    声色虽云属少年,稍知撙节乃无愆。
    关精息气宜闻早,莫使羽苞火中燃。
    zhangZMZ
        10
    zhangZMZ  
    OP
       2018-10-02 19:53:05 +08:00
    @iiduce 真 tmd 的人才
    coderluan
        11
    coderluan  
       2018-10-02 20:11:59 +08:00
    那书挺好的,看不进去编译原理和 linkers and loaders 的都可以看看。

    PS:楼主不想别人回复的莫名其妙,就别把标题和正文写的莫名其妙。
    shpdnx
        12
    shpdnx  
       2018-10-03 05:52:43 +08:00 via Android
    在做义工吗?
    医院有义工。福利院有义工。寺庙有义工。
    ryd994
        13
    ryd994  
       2018-10-03 07:07:58 +08:00 via Android
    @zhangZMZ 第一个 if 筛掉已经在忙的情况,避免没必要的抢锁,第二个 if 保证安全。
    另外你这个代码有问题,万一抢到了锁,但 plnst 不空,那 unlock 也跳过了,就会死锁。
    zhangZMZ
        14
    zhangZMZ  
    OP
       2018-10-03 13:55:52 +08:00
    @ryd994 可否进一步探讨?
    zhangZMZ
        15
    zhangZMZ  
    OP
       2018-10-03 14:21:38 +08:00
    @ryd994 第一个 if 筛掉已经在忙的情况,避免没必要的抢锁,第二个 if 保证安全。
    第二个 if 保证安全?
    ryd994
        16
    ryd994  
       2018-10-03 15:43:05 +08:00 via Android
    @zhangZMZ 你这个看起来是个单例模式
    那这个变量要么 null,要么初始化之后就不会再变
    如果不考虑性能,安全的写法是
    锁,检查,如果空就初始化
    但是这样的话就每次都要锁,对这个变量的访问只能单线程
    所以加一个优化,先看看是不是空,不空就直接用了,不需要再初始化也不需要加锁
    第二个 if 还是不可以去掉,因为第一个 if 可能遇到 race condition
    zhangZMZ
        17
    zhangZMZ  
    OP
       2018-10-03 16:46:52 +08:00
    @ryd994 问题有 2 点:
    1 没明白 race condition,因为如果是资源竞争那么第一个 if 和 lock 就足以解决问题了;
    2 在程序员的自我修养的第 29 页写的是“ 2 个 if 能最大的降低 lock 的调用开销”,第一个 if 的作用我能理解,关键是第 2 个 if,它如何降低开销的?
    zhangZMZ
        18
    zhangZMZ  
    OP
       2018-10-03 18:49:47 +08:00
    既然都加锁了为何还会引起资源竞争?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3189 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 12:39 · PVG 20:39 · LAX 04:39 · JFK 07:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.