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