• [长沙] 诚聘 Ruby 精英! at 2018年06月13日

    是公务员?

  • 你是对的,感谢大神提醒。

    我这边表情包也显示不出来。 挺好奇原因的

  • 在COW背景下,不就是共享同一块数据的么? 如果各自有修改数据的行为,才会触发copy,来避免相互影响。

    我更新了一下,加上了COW的背景。

  • 求详解?

  • 浅谈尾递归 at 2018年06月05日

    递归调用出现在函数末尾,而且该调用的返回值就是当前函数的返回值。

    这时候,执行递归调用的堆栈空间不依赖递归调用之前的堆栈数据(上下文),因为在调用回归的时候,没有和之前的上下文有交互。所以在代码编译执行的时候,就可以只关注当前调用的堆栈数据,不用维护每一次递归调用的堆栈数据。不管函数递归多少次,需要维护的堆栈信息的数量就等于单次调用的数量,是一个常数,不会因为调用次数增加而翻倍。

    这样就可以在一个有限的堆栈空间中,执行该递归函数,不会栈溢出。 我暂时的理解是这样的。

  • 数据结构之 HashMap at 2018年06月03日

    谢谢,一起交流才能真正暴露自己的知识盲点,也能在交流中相互学习提高。由于你的评论,我调整了文章一些不合适的说法,在此表示感谢。

  • 数据结构之 HashMap at 2018年06月03日

    目前水平有限,GIL源码分析还来不起,有兴趣可以参考这篇文章

    GIL 不意味着 线程安全

    这句话是无比正确的,应该不会有人说GIL会保证自己写的ruby代码是线程安全的。

    但是GIL可以保证基于C代码的Ruby原生方法是原子性执行的,检查和释放GIL都是在C方法的执行前和执行后进行的。

    文中讨论线程安全是针对哈希的操作而言的,hash的赋值等操作,是由Ruby的原生方法实现的。

    所有的讨论并不针对自己写的Ruby代码。

    所有讨论基于MRI,不涉及Jruby,以及Rubinius。

  • 数据结构之 HashMap at 2018年06月03日

    连并发都没有,哪儿扯得到并行那里去。Ruby中只有多线程IO操作时能实现并发,在等待IO的时候GIL会释放,这些线程可以穿插执行。回到hash操作,并不能实现多个线程对同一个哈希进行并发操作, 因为代码是一条一条执行的。

    有多个Thread 同时执行,如果你要认为这是并发的话,也行的,没有问题,它们确实在状态上可以认为是并发。不过这些本质上先后执行的线程并不会造成并发问题

    我文中想表达的是真正的并发,所以在理解上可能会有分歧。我调整了一下说法。

  • 数据结构之 HashMap at 2018年06月03日

    Ruby中有GIL,也叫全局解释锁。它会保证同一时刻只有一段代码被解释执行。当有多个线程同时对某个hash进行写操作的时候,本质上,这些线程是一个个排队先后执行的,所以并不会造成并发竞争问题。

    在Ruby中some_hash[some_key] = some_value这种哈希操作虽然有多个步骤(取哈希值=>做映射=>再赋值),但整个操作在底层是由C语言实现的,而GIL会保证这段C代码执行的原子性。这里面并没有真正的并发。

    上面所说的点,和有关GIL的知识,建议详细吃透 https://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil 这篇文章。