2012-12-13 44 views
3

我见过这个操作符被使用了很多,我甚至每次使用它都会改变。所有的酷宝石都有这种和平的代码。但是使用这个操作符时线程的安全性呢?Ruby || =操作员线程安全

+1

它本质上不是线程安全的,比x = x ||更安全。 y';也就是说,它不是*线程安全的。 (可能会有一些基于特定实现的轻微警告,但它涉及一个读写对,**不保证原子性*或*可见性**。) – 2012-12-13 05:15:38

回答

1

与其他任务一样,如果没有互斥锁,它也不是真正的线程安全的。它可能看起来是线程安全的,取决于系统中的核心数量,它可能是ish。我注意到4线程/ 8线程系统比2线程/ 2线程系统有更多的线程问题,所以如果你有权访问其中的一个线程,可以使用它来确保你已经得到你想要的任何解决方案。

写锁定可能是凌乱的业务,但它是您为生活在多线程世界中而付出的代价。

+1

不要拆解 - 线程安全的ish ==不安全的。 – dbenhur

+0

@Tadman - 你确定这是不是一个安全的操作在MRI中归功于GIL? – pguardiario

+0

这实际上取决于字节码是如何生成和解释的。像其他语言的'+ ='或甚至'++'一样,它被实现为加载,测试和存储。如果这两者之间有中断的机会,那么它不是没有锁的线程安全。 – tadman