2009-02-18 76 views
6

说我有三个线程需要访问一个集合,我在每个线程的访问周围使用一个锁定块。出现以下情况...锁定陈述C#

(1)线索1沾到集合锁
(2)线程2被阻断
(3)线3堵塞

当线程1释放锁,谁会接下来的锁?它是否是FIFO访问?

谢谢

回答

17

你不应该在乎谁下一个锁。

+2

你可以扩展说你*不能*关心。也许。 – JMD 2009-02-18 20:39:00

+0

我意识到我应该编程这些线程,以便我不在乎,我只是想知道这个机制是什么。 – 2009-02-18 20:44:26

+2

http://msdn.microsoft.com/en-us/library/aa645740(VS.71).aspx#vcwlkthreadingtutorialexample4mutex “运行样本的机器的速度和操作系统会影响输出顺序。” – 2009-02-18 20:57:31

4

假设它像Win32那么答案是它可能是FIFO,但它可能不是(它是别的东西)。例如,优先级较高的线程应该是第一个;但线程可以暂时提升或降低他们的优先级,这取决于他们最近在做什么。

5

你的问题意味着你正在寻找一个先进先出的行为?然后,你可能想通过的Jakub Sloup尝试这种代码:

Monitor/lock which remember order in C# to simulate FIFO

正如已经在其他的答案中提到,没有保证的顺序等待的线程将获得锁。

4

作为您的问题的答案,所有主题都会收到monitor.pulse,然后将争夺下一个获得锁定的人。

我相信wintellect的人写了一篇关于这种行为如何导致不公平的博客的博客,但是在监视器中根本没有公平性。

3

答案是根据定义,不确定。