我今天参加了一次面试,面试官问了我以下问题:
重入和互斥线程安全吗?你能解释一下为什么吗?
我对并发编程比较陌生,无法回答。但我说...
互斥是线程安全的。但是重入不是,这就是我们有重入锁的原因。
面试官转到了下一个问题,但转到了另一个领域……我想我把这个搞砸了……
当他问我这个时,他希望我说什么?
我今天参加了一次面试,面试官问了我以下问题:
重入和互斥线程安全吗?你能解释一下为什么吗?
我对并发编程比较陌生,无法回答。但我说...
互斥是线程安全的。但是重入不是,这就是我们有重入锁的原因。
面试官转到了下一个问题,但转到了另一个领域……我想我把这个搞砸了……
当他问我这个时,他希望我说什么?
正确答案应该是:
是的,它们是线程安全的实现。
重入
以这样的方式编写代码,它可以由一个任务部分执行,由另一个任务重新输入,然后从原始任务恢复。这需要将状态信息保存在每个任务的本地变量中,通常在其堆栈中,而不是在静态或全局变量中。
一个例子
互斥
对共享数据的访问使用确保在任何时候只有一个线程读取或写入共享数据的机制进行序列化。如果一段代码访问多个共享数据段,则需要非常小心——问题包括竞争条件、死锁、活锁、饥饿以及许多操作系统教科书中列举的各种其他弊端。
一个例子
两者都是线程安全的 - 您也可以在 Wikipedia 上阅读它:
http://en.wikipedia.org/wiki/Reentrant_(subroutine)
http://en.wikipedia.org/wiki/Mutual_exclusion
重入互斥锁是可以如果确保每个锁都有相应的解锁,则可以从同一个线程多次锁定。
我引用http://en.wikipedia.org/wiki/Reentrant_(subroutine)
重入和线程安全的概念都与函数处理资源的方式有关。但是,它们并不相同。
虽然可重入的概念会影响函数的外部接口,但线程安全只涉及函数的实现,而不涉及其外部接口。
-- 在大多数情况下,要使不可重入函数可重入,必须修改其外部接口,以便所有数据都由函数调用者提供。
-- 要使线程不安全的函数线程安全,只需要更改实现,通常通过添加同步块来保护共享资源不被不同线程并发访问。
因此,可重入性是比线程安全更基本的属性,并且根据定义,导致线程安全:每个可重入函数都是线程安全的;然而,并不是每个线程安全函数都是可重入的。