Zwei Fragen zu Ruby-Threads

8

Erster:

  • Wie kann ich einen Thread erstellen, der nicht sofort startet? Wenn ich initialize ohne einen Block verwende, wird eine Ausnahme ausgelöst.

  • Wie kann ich Thread ableiten, damit ich einige benutzerdefinierte Attribute hinzufügen kann, aber die gleiche Funktionalität wie die Basis-Thread-Klasse beibehalten kann? Ich möchte auch nicht die Methode initialize(&block) dafür verwenden müssen.

Um das besser zu veranschaulichen:

Für die erste Frage:

%Vor%

Für die Sekunde:

%Vor%

Ich suche etwas Ähnliches. Hoffe du kannst helfen.

    
Geo 27.02.2010, 10:59
quelle

3 Antworten

11

Frage 1

Die Untersuchung der MRT-Quelle 1.8.7 ergab keinen offensichtlichen Weg, einen Thread im "gestoppten" Zustand zu starten.

Was Sie tun können, ist, den Threadblock auf einem gesperrten Mutex zu haben, dann entsperren Sie den Mutex, wenn der Thread gehen soll.

%Vor%

Frage 2 (Sort Of)

Wusstest du, dass du Argumente an deinen Thread übergeben kannst? Alles, was an Thread.new übergeben wird, wird als Blockargument übergeben:

%Vor%

Es gibt auch "lokale Thread-Variablen", einen Schlüssel / Wert-Speicher pro Thread. Verwenden Sie Thread#[]= , um Werte festzulegen, und Thread#[] , um sie zurückzuerhalten. Sie können Zeichenfolgen oder Symbole als Schlüssel verwenden.

%Vor%

Frage 2, Wirklich

Sie können tun, was Sie tun möchten. Es ist eine Menge Arbeit, vor allem wenn die übliche Handhabung von Threads so einfach ist. Sie müssen die Plus- und Minuspunkte abwägen:

%Vor%     
Wayne Conrad 27.02.2010, 17:06
quelle
3
%Vor%     
Farrel 27.02.2010 15:04
quelle
2

Ignoriere das Beispiel von Ruby-Doc 1.8.7 , weil es enthält eine Race-Bedingung. Siehe Ruby 2-Beispiel oder etwas Ähnliches wie folgt:

Ich habe das in Ruby 2.0 und Ruby 1.8.7 getestet, und ich fand, dass der Aufruf von #wakeup in 1.8.7 nicht genug war. 'Ich musste #run aufrufen. Folgendes scheint in beiden zu funktionieren:

%Vor%     
Patrick 12.02.2014 23:26
quelle