Вот вопрос, о котором спорит моя учебная группа:
(g) Рассмотрим следующий код C #:
public class Demo {
private static readonly object a = new object();
private static readonly object b = new object();
public static void Main (string[] args) {
Demo d = new Demo();
Task t1 = Task.Factory.StartNew(d.g);
Task t2 = Task.Factory.StartNew(d.h);
t2.Wait();
t1.Wait();
}
private void g() {
lock (a) {
lock (b) {
Console.Write("G");
}
}
}
private void h() {
lock (b) {
lock (a) {
Console.Write("H");
}
}
}
}
Это многопоточная программа, поэтому различные исполнения могутдают разные результаты.Поставьте галочку рядом с полным выводом, который может выдать программа.(Последний выбор означает отсутствие вывода.) Вывод Ответ
Вывод ------- Возможно?
GH
HG
G
H
(nothing)
Что мы думаем:
GH будетвыход, если t1 заблокирован b, прежде чем t2 заблокирован b.
(ничего) будет выходом, если t1 заблокирован a, а затем t2 заблокирован b, потому что это вызовет тупиквывод, если t1 заблокировал b, а затем, пока t1 все еще удерживал блокировку на b, t2 запустился, потому что t2.wait ожидал бы, пока t1 не завершит свою работу.или HG.Однако один из нас запускал код 200 000 раз, и иногда он получал HG ... Я не понимаю
Я просто не уверен в этих ответах.Что вы все думаете?Любая помощь с благодарностью!