今天我试图向一位||=在MRI中不是线程安全的同事解释.我想我会看看Ruby源代码,试着看看我是否可以指出Ruby调度程序可以切换线程上下文的位置,但是我在浏览代码时遇到了麻烦.我希望有经验的人可以带我浏览被击中的文件.
到目前为止,我知道Bison接受parse.y并生成一个parse.c调用一些底层函数的文件.我看到它||被解析为,tOROP但接下来发生的事情让我有点迷失
还有一些像开膛手这样的工具,我可以使用它来使这个过程更容易一些吗?(并且在那个注释中,如果有人能指出我定义Ripper源代码的位置会有所帮助)
忘记解析器,如果您查看这里的compile.c 中的代码,您将看到如何生成指令来处理赋值或操作。每次调用 ADD_INSNL 都会发出一条指令。在第 4553 行,您会看到一个if条件,该条件在通过调用第 4546 行的 COMPILE 宏发出的代码读取 LHS 的值后测试 LHS 的值,以便决定是否分配新值。在此期间,另一个线程可能会出现并更改读取的值,因此分配在不应该完成的时候完成(或未完成)。
至于如何创建 NODE_OP_ASGN_OR,请参阅函数 new_op_assign_gen() 中对 parse.y 调用的 NEW_OP_ASGN_OR(在 node.h 中定义)的调用。
希望行号不会太快改变,从而使这些 URL 失效。