Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多线程锁定,有趣的时刻(期中练习)_Multithreading_Locking_Thread Safety_Deadlock - Fatal编程技术网

Multithreading 多线程锁定,有趣的时刻(期中练习)

Multithreading 多线程锁定,有趣的时刻(期中练习),multithreading,locking,thread-safety,deadlock,Multithreading,Locking,Thread Safety,Deadlock,我的研究小组正在讨论一个问题: (g)考虑以下C代码: 这是一个多线程程序,因此不同的执行可能会产生不同的结果。在程序可能产生的完整输出旁边打勾。(最后一个选项表示无输出。) 输出答案 输出------可能吗 GH HG G H (nothing) 我们的想法: 如果t1在t2锁定b之前锁定b,则GH将是输出 (nothing)将是t1锁定a,然后t2锁定b的输出,因为这将导致死锁 如果t1锁定了b,则G将是输出,然后当t1仍然保持b上的锁定时,t2开始,因为t2.wait

我的研究小组正在讨论一个问题:

(g)考虑以下C代码:

这是一个多线程程序,因此不同的执行可能会产生不同的结果。在程序可能产生的完整输出旁边打勾。(最后一个选项表示无输出。) 输出答案

输出------可能吗

GH  
HG  
G   
H   
(nothing)
我们的想法:

如果t1在t2锁定b之前锁定b,则GH将是输出

(nothing)将是t1锁定a,然后t2锁定b的输出,因为这将导致死锁

如果t1锁定了b,则G将是输出,然后当t1仍然保持b上的锁定时,t2开始,因为t2.wait将等待t1完成

想不出你怎么可能得到H或HG。然而,我们中的一个人运行了200000次代码,他有时会得到HG。。。我不明白


不过,我对这些答案并不确定。你们都怎么想?非常感谢您的帮助

绝对不能保证在
h()
之前启动
g()
。据我所知,
StartNew()
实际上并没有启动任务,而是将其排队等待下一个可用线程。

绝对不能保证
g()
会在
h()
之前启动。据我所知,
StartNew()
实际上并没有启动任务,而是将其排队等待下一个可用线程。

我认为只获得G或H的唯一方法是让这两个函数都完成,但是程序在控制台刷新第二个字母之前结束。

我认为只获得G或H的唯一方法是让两个函数都完成,但程序在控制台刷新第二个字母之前结束。

如果您得到一个字母,这意味着一个线程可以同时获得两个锁。这也意味着它将能够释放两个锁,另一个线程将成功完成,并打印另一个字母。根据这种推理,
GH
HG
都是可能的输出。此外,还可能出现死锁情况,即线程1持有一个锁,线程2持有另一个锁。

如果您收到一个字母,这意味着一个线程设法获得两个锁。这也意味着它将能够释放两个锁,另一个线程将成功完成,并打印另一个字母。根据这种推理,
GH
HG
都是可能的输出。此外,还可能出现死锁情况,即线程1持有一个锁,线程2持有另一个锁。

HG可能发生,因为无法保证新线程何时开始执行。创建
任务t2
后,操作系统可以自由地首先运行它,然后返回并运行
t1

HG,因为无法保证新线程何时开始执行。创建
任务t2
后,操作系统可以自由地首先运行它,然后返回并运行
t1

编辑:我的意思是有时我们会得到HG。从来没有收到过一封信。(我也编辑了我的问题,我只是想通过在评论中写下它来确保人们看到编辑)。另外,感谢您的编辑:)您应该编辑您的实际问题,而不是在评论中张贴更正。另外,永远不要将代码的空格加倍。编辑:我的意思是有时我们会得到HG。从来没有收到过一封信。(我也编辑了我的问题,我只是想通过在评论中写下它来确保人们看到编辑)。另外,感谢您的编辑:)您应该编辑您的实际问题,而不是在评论中张贴更正。另外,永远不要将代码的空格加倍。我们现在要讨论的一件事是:t2.wait()和t1.wait()如何影响这种情况?我们小组的一个成员说t1可以锁定a和b,在它释放b之前,t2线程开始请求b上的锁,但它无法获得,因为t1目前拥有该锁。然后,在t1释放b之前,当t2仍在请求锁定b时,主线程继续执行t2.wait()。这不会导致它冻结吗?有没有可能在冷冻前打印出来?(对不起,我们的脑袋太厚了!)哎呀!我们想出来了!Sry!我们现在一直坚持的一件事是:t2.wait()和t1.wait()如何影响这种情况?我们小组的一个成员说t1可以锁定a和b,在它释放b之前,t2线程开始请求b上的锁,但它无法获得,因为t1目前拥有该锁。然后,在t1释放b之前,当t2仍在请求锁定b时,主线程继续执行t2.wait()。这不会导致它冻结吗?有没有可能在冷冻前打印出来?(对不起,我们的脑袋太厚了!)哎呀!我们想出来了!Sry!
GH  
HG  
G   
H   
(nothing)