我今天参加了一次采访,面试官问我以下问题:

重新输入和相互排除线程安全吗?你能解释为什么吗?

我对并发编程相对较新,无法回答。但是我说...

相互排除是安全的。但是,重新进入不是,这就是我们有锁定锁的原因。

面试官继续谈到下一个问题,尽管我想我把这个问题搞砸了...

当他问我这个问题时,他期望我怎么说?

有帮助吗?

解决方案

适当的答案应该是:

是的,它们是线程安全的实施。

重新进入

编写代码的方式可以通过一个任务部分执行,并由另一个任务重新输入,然后从原始任务恢复。这需要在每个任务的本地变量中保存状态信息,通常在其堆栈上,而不是静态变量或全局变量。

一个例子

相互排斥

使用机制序列化对共享数据的访问,这些机制可确保只有一个线程随时读取或写入共享数据。如果一块代码访问多个共享数据(问题)包括比赛条件,僵持,生计,饥饿以及许多其他操作系统教科书中列举的其他弊端,则需要非常小心。

一个例子

其他提示

两者都是安全的 - 您也可以在Wikipedia上阅读它:
http://en.wikipedia.org/wiki/reentrant_(subroutine)
http://en.wikipedia.org/wiki/mutual_exclusion

重点静音是静音的静音,如果确保每个锁定都有相应的解锁,可以从同一线程多次锁定。

我引用 http://en.wikipedia.org/wiki/reentrant_(subroutine)

重新进入和线程安全的两个概念都与功能处理资源的方式有关。但是,它们不一样。

虽然重新输入的概念会影响函数的外部接口,但线程安全性仅涉及该功能的实现而不是其外部接口。

- 在大多数情况下,要使非伦特函数重新进入,必须修改其外部接口,以使所有数据均由函数的呼叫者提供。

- 为了制作线程安全函数线程安全,通常只需要通过添加同步块来保护共享资源免受不同线程的并发访问而进行更改。

因此,重新输入比线程安全性更为基础,从定义上讲,导致线程安全:每个重新输入函数都是线程安全;但是,并非每个线程安全函数都是重新进入的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top