Что такое C # ' s версия GIL?

В текущей реализации CPython есть объект, известный как «GIL» или «Global Interpreter Lock». По сути, это мьютекс, который не позволяет двум потокам Python выполнять код Python одновременно. Это предотвращает возможность двух потоков повредить состояние интерпретатора Python, но также предотвращает совместное выполнение нескольких потоков. По сути, если я сделаю следующее:

# Thread A
some_list.append(3)
# Thread B
some_list.append(4)

Я не смогу испортить список, потому что в любой момент времени выполняется только один из этих потоков, поскольку для этого они должны содержать GIL. Сейчас, элементы в списке могут быть добавлены в некотором неопределенном порядке, но дело в том, что список не поврежден, и всегда будут добавляться две вещи.

Итак, теперь о C #. C # по сути сталкивается с той же проблемой, что и Python, так как же C # предотвратить это? Мне также было бы интересно услышать историю Java, если кто-нибудь ее знает.


Пояснение: Меня интересует, что происходит без явных операторов блокировки, особенно с виртуальной машиной. Я знаю, что блокирующие примитивы существуют как для Java, так и для C # - они также существуют в Python: GIL не используется для многопоточного кода, кроме как для того, чтобы интерпретатор был в здравом уме. Меня интересует прямой эквивалент вышеизложенного, поэтому на C #, если я могу вспомнить достаточно ...: -)

List<String> s;
// Reference to s is shared by two threads, which both execute this:
s.Add("hello");
// State of s?
// State of the VM? (And if sane, how so?)

Вот другой пример:

class A
{
    public String s;
}
// Thread A & B
some_A.s = some_other_value;

// some_A's state must change: how does it change?
// Is the VM still in good shape afterwards?

Я не хочу писать плохой код C #, Я понимаю инструкции lock . Даже в Python GIL не дает вам волшебного многопоточного кода: вы все равно должны блокировать общие ресурсы. Но GIL предотвращает повреждение "виртуальной машины" Python - меня интересует именно такое поведение.

8
задан Thanatos 26 October 2010 в 18:02
поделиться