Stoppt Threads von der Interleaving-Ausgabe

8

Das folgende Programm erstellt zwei gleichzeitig ausgeführte Threads, die jeweils für eine zufällige Zeitspanne schlafen, bevor eine Textzeile auf stdout gedruckt wird.

%Vor%

Die Ausgabe sieht im Allgemeinen ungefähr wie

aus %Vor%

Wie stellen Sie sicher, dass immer nur ein Thread in stdout schreiben kann? Dies scheint der Fall zu sein, in dem STM gut sein sollte, aber alle STM-Transaktionen müssen den Typ STM a für einige a haben, und eine Aktion, die auf den Bildschirm druckt, hat den Typ IO a scheint eine Möglichkeit zu sein, IO in STM einzubetten.

    
Chris Taylor 31.12.2013, 09:06
quelle

3 Antworten

13

Der Umgang mit Ausgaben mit STM besteht in einer Ausgabewarteschlange, die von allen Threads gemeinsam genutzt wird und von einem einzelnen Thread verarbeitet wird.

%Vor%     
shang 31.12.2013, 10:50
quelle
4

Das Sperren in der beschriebenen Weise ist mit STM nicht möglich. Dies liegt daran, dass STM auf optimistischem Sperren basiert und daher jede Transaktion jederzeit neu gestartet werden kann. Wenn Sie eine Operation IO in STM eingebettet haben, könnte sie mehrmals ausgeführt werden.

Die einfachste Lösung für dieses Problem ist die Verwendung von MVar als Sperre:

%Vor%

In dieser Lösung wird die Sperre als Argument an printer übergeben.

Manche Leute bevorzugen es, die Sperre als globale Variable der obersten Ebene zu deklarieren, aber das erfordert derzeit unsafePerformIO und beruht auf Eigenschaften von GHC, dass AFAIK nicht Teil des Haskell-Sprachberichts ist (insbesondere beruht es auf der Tatsache, dass eine globale Variable mit nicht-polymorphem Typ höchstens einmal während der Ausführung eines Programms ausgewertet wird).

>     
Petr Pudlák 31.12.2013 09:17
quelle
4

Ein bisschen Forschung, basierend auf Petr Pudláks Antwort zeigt, dass es ein Modul Control.Concurrent.Lock im concurrent-extra Paket, das eine Abstraktion um MVar () -basierte Sperren bietet.

Die Lösung, die diese Bibliothek verwendet, ist

%Vor%     
Chris Taylor 31.12.2013 09:57
quelle

Tags und Links