2012-06-27 10 views
7

Aus früheren Arbeit in C# und Java, ich bin auf eine Aussage gewöhnt wie diese nicht in der Thread-sicher:Können Ruby-Threads beim Schreiben nicht kollidieren?

x += y; 

Allerdings habe ich nicht in der Lage gewesen, eine Kollision zwischen Threads zu beobachten, wenn Sie den obigen Code ausgeführt wird parallel zu Ruby.

Ich habe gelesen, dass Ruby automatically prevents multiple threads from writing to the same data concurrently. Ist das wahr? Ist der Operator += also Thread-sicher in Ruby?

Antwort

2

Nun, es hängt von Ihrer Implementierung und vielen Dingen ab. In der MRT gibt es so etwas wie die GVL (Giant VM Lock), die steuert, welcher Thread gerade Code gleichzeitig ausführt. Sie sehen, in der MRI kann nur ein Thread Code Ruby gleichzeitig ausführen. Während die C-Librarys darunter einen anderen Thread laufen lassen können, während sie CPU in C Code verwenden, um riesige Zahlen zu multiplizieren, kann der Code selbst nicht zur selben Zeit ausgeführt werden. Das bedeutet, dass eine Anweisung wie die Zuweisung möglicherweise nicht gleichzeitig mit einer anderen der Zuweisungen ausgeführt wird (obwohl die Zusätze möglicherweise parallel ausgeführt werden). Die andere Sache, die passieren könnte, ist dies: Ich glaube, ich habe gehört, dass die Zuweisungen zu int s unter Linux atomar sind. Wenn Sie also unter Linux arbeiten, könnte das auch etwas sein.

+0

Irgendeine Idee, wenn die GIL jemals für einen Thread in der Mitte der Ausführung von 'x + = y' fallengelassen wird? Oder wird es immer nur an _Statement_-Grenzen erworben und freigegeben? Oder übergeordnete Grenzen? – sarnold

+0

Eine sehr detaillierte Antwort auf Threads im Allgemeinen finden Sie unter http://stackoverflow.com/questions/56087/does-ruby-have-real-multithreading. – Chris

+0

@sarnold: Die Veröffentlichung der GVM hängt alles vom C-Code ab. Wenn beispielsweise bei der Implementierung der Bignum-Multiplikation die Zahlen außerhalb einer bestimmten Größe liegen, wird die GVL freigegeben, so dass anderer Ruby-Code ausgeführt werden kann, während das C die Zahlen multipliziert. Die GVL ist nur dann wirklich von Bedeutung, wenn Sie C-Erweiterungen entwickeln. – Linuxios

0
x += 1 

ist in jeder Hinsicht gleichwertig

x = x + 1 

(wenn Sie + neu zu definieren, können Sie auch das Ergebnis der += automatisch neu definieren)

In dieser Notation ist es klarer ist dies nicht eine atomare Operation, und ist daher nicht Thread-sicher garantiert.

+0

Ich verstehe, dass '+ =' den Operator '+' verwendet. Ich denke, ich hätte meine Frage auf eine ganzzahlige Addition beschränken sollen, denn das ist der Fall, der mich am neugierigsten macht. Es würde mich interessieren, was Sie in dieser Antwort so vertrauen. Wie gesagt, ich bin vertraut mit C# und Java, wo das, was du sagst, wahr ist. Aber bis jetzt habe ich keine Beweise dafür mit MRI gesehen; und tatsächlich, was ich gefunden habe (wie der Artikel, mit dem ich mich in der Frage verbunden habe), scheint das Gegenteil nahe zu legen. Ich denke, was ich sage, ist eine Referenz würde sehr geschätzt werden :) –

+0

Sind Sie zuversichtlich, dass kein anderer Thread der Ausführung 'x' zwischen dem Zeitpunkt, zu dem sein Wert abgerufen wird und bevor der neue Wert geschrieben wird, zu aktualisieren? – sarnold

Verwandte Themen