В текущей реализации CPython существует объект, известный как «GIL» или «Global Interpreter Lock». Это, по сути, мьютекс, который предотвращает одновременное выполнение двумя потоками Python кода Python. Это предотвращает возможность повреждения двух потоков в корневом состоянии интерпретатора Python, но также предотвращает совместное выполнение нескольких потоков. По существу, если я делаю это:Что такое версия C# от GIL?
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
Я не могу повредить список, потому что в любой момент времени только один из этих потоков выполняются, так как они должны держать GIL, чтобы сделать это. Теперь элементы в списке могут быть добавлены в некотором неопределенном порядке, но дело в том, что список не поврежден, и две вещи всегда будут добавлены.
Итак, теперь на C#. C# по существу сталкивается с той же проблемой, что и Python, поэтому как C# предотвращает это? Мне также будет интересно услышать историю Java, если кто ее знает.
Разъяснение: Я заинтересован в том, что происходит без явных заявлений фиксирующих, особенно в VM. Я знаю, что для примитива Java & существуют блокирующие примитивы: они существуют и на 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 и Clojure] (HTTP: //www.bestinclass .dk/index.clj/2009/10/python-vs-clojure-evolving.html), для обсуждения GIL и того, как проблема параллелизма обрабатывается на языках без GIL. –
Я понимаю, что это компромисс между тем, какой класс проблем будет более обременительным для решения. См. Мой ответ ниже. – pyfunc