Parallele Existenz verstehen und finden

9

Ich nehme ein List[Int] und möchte parallel nach einem Wert x wo x * 10 > 500 suchen. Daher sollte exists true zurückgeben, wenn die Liste einen Wert von 51 oder höher enthält.

%Vor%

Was Ergebnisse liefert:

%Vor%

Ich benutze eine Dual-Core-Maschine mit Scala 2.9.1.

Was ist hier los? Funktioniert das wie beabsichtigt? Warum sendet es nicht einfach die Nachricht an die anderen Threads, um die Mission abzubrechen, sobald das erste Ergebnis gefunden wird? Dies könnte sehr kostspielig sein, wenn f eine teure Berechnung ist.

find scheint auf ähnliche Weise zu funktionieren und sucht nach vielen weiteren Werten, obwohl die Dokumente sagen, dass das "Element nicht unbedingt das erste derartige Element in der Iterationsreihenfolge sein muss" und "die Wahl ist nicht deterministisch" / p>     

Luigi Plinge 12.12.2011, 05:06
quelle

2 Antworten

2
  

Warum sendet es nicht einfach die Nachricht an die anderen Threads zum Abbrechen   Mission, sobald das erste Ergebnis gefunden wird?

Weil das nicht möglich ist. JAVA LASST DAS NICHT TUN. Oder eher, aber es ist veraltet.

Siehe Beschreibung von (veraltet) Thread.stop() :

  

Diese Methode ist von Natur aus unsicher. Stoppen eines Threads mit Thread.stop   bewirkt, dass alle von ihm gesperrten Monitore entsperrt werden (als   natürliche Folge der ungeprüften ThreadDeath-Ausnahme   den Stapel hoch). Wenn eines der zuvor von diesen geschützten Objekte   Monitore waren in einem inkonsistenten Zustand, die beschädigten Objekte wurden   sichtbar für andere Threads, was möglicherweise zu willkürlichem Verhalten führt.   Viele Verwendungen von stop sollten durch Code ersetzt werden, der einfach einige modifiziert   Variable, um anzuzeigen, dass der Zielthread nicht mehr ausgeführt werden soll. Das   Der Ziel-Thread sollte diese Variable regelmäßig überprüfen und von dort zurückkehren   seine Laufmethode in geordneter Weise, wenn die Variable dies anzeigt   ist aufhören zu laufen. Wenn der Zielthread lange Zeit wartet (auf einem   B. die Zustandsvariable), sollte die Interrupt-Methode verwendet werden   um das Warten zu unterbrechen. Weitere Informationen finden Sie unter Warum sind Thread.stop,   Thread.suspend und Thread.resume Veraltet? .

Mit anderen Worten, da Multithreaded-Code mit Sperren inhärent gebrochen ist, verwarfen sie eine vollkommen gute Methode, die gerne mit Threads verwendet werden kann, die keinen veränderlichen Zustand teilen und daher keine Datenstrukturen sperren müssen.

    
Daniel C. Sobral 12.12.2011 13:21
quelle
1

Ich verstehe den Wunsch, weil ich dachte, dass es nett wäre, ein solches Verhalten zu haben - aus der Absicht, schnellen, existenten Code zu verwenden, sieht es vernünftig aus, es zu erwarten, aber natürlich, wie sollte es implementiert werden?

In Abkürzungsausdrücken wird der nächste Aufruf nicht gestartet, wenn das Ergebnis gefunden wird - das ist einfach.

Aber wie laufen Sie hinter einer Aufgabe, die Sie erledigt haben, und fangen Sie sie erneut, um sie zu stoppen? Sie müssten wissen, welcher von ihnen bereits beendet ist, und vielleicht in eine Wettlaufsituation geraten, denn während des Testens, ob es noch läuft, könnte es "wahr" zurückgeben, aber anschließend unvollkommen enden.

Die Funktion, die in exists aufgerufen wird, könnte neue Threads selbst starten - wie sollten sie generell von außen gestoppt werden? Indem Sie optional eine stop execution -Methode als zweiten Parameter angeben?

    
user unknown 12.12.2011 07:06
quelle