2010-05-16 9 views
9

Ich überlege, C++ 0x-Threads in meiner Anwendung anstelle von Boost-Threads zu verwenden. Ich bin mir jedoch nicht sicher, wie ich das, was ich mit Standard-C++ - 0x-Threads habe, neu implementieren würde, da sie anscheinend keine interrupt()-Methode haben.Wie unterbricht man einen wartenden C++ 0x-Thread?

My aktuellen Einstellung ist:

  • ein Master-Faden, der Arbeit schafft;
  • mehrere Worker-Threads, die die Befehle des Masters ausführen.

Arbeiter rufen wait() auf mindestens zwei verschiedenen Zustandsvariablen. Der Meister hat einen "Zeitlimit" -Zustand: In diesem Fall sagt er allen Arbeitern, dass sie anhalten und geben sollen, was auch immer sie bis dahin bekommen haben. Mit Boost-Threads verwendet der Master einfach interrupt_all() für eine Thread-Gruppe, was dazu führt, dass die Worker nicht mehr warten. Falls sie im Moment nicht warten, setzt der Master auch eine bool Flagge, die Arbeiter regelmäßig überprüfen.

In C++ 0x std::thread sehe ich keinen Ersatz für interrupt(). Vermisse ich etwas? Wenn nicht, wie kann ich das obige Schema implementieren, damit die Arbeiter nicht für immer schlafen können?

Antwort

9

Leider sehe ich keinen anderen Weg als Polling, anstatt zu warten, verwenden Sie eine zeitgesteuerte Wartezeit und eine Variable, um die Unterbrechung zu melden.

void th(Interruptor& interruptor) { 
    try { 

    ... 

    while (cnd1.timed_wait(d)==false) { 
     interruptor.check_interruption_point(); 
    } 
    ... 
    } catch (interrupted_exception &) {} 
} 

Die Interruptor Klasse wird eine boolesche Variable mit einem Mutex geschützt halten oder mit atomaren Operationen, wenn Sie sie haben und zwei Funktionen unterbrechen und check_interruption_point, die mit einem interrupted_exception werfen, wenn die boolean wahr ist. Der Mater-Thread erstellt eine Interruptor-Variable, die den betroffenen Threads zum Zeitpunkt der Erstellung übergeben wird. Der Master hat die Möglichkeit alle Threads, die von diesem Interruptor abhängen, sofort zu unterbrechen. Sie können natürlich einen Interruptor für jeden Thread erstellen, wenn Sie jeweils einen Thread explizit unterbrechen möchten.

Bis zu Ihnen, um die Dauer auf die zeitgesteuerte Wartezeit zu definieren, damit Ihre Threads reagieren können, sobald Ihr Programm es erfordert.

+0

Ich denke, ich werde Boost-Threads dann weiter verwenden. Sie sind auch fehlerhaft, aber zumindest habe ich einen stabilen Workaround für sie. – doublep

1

Warten boost auf die interrupt() ist eine notify_all auf die Bedingung einen Thread ist derzeit blockiert emittieren und dann überprüfen, ob eine Unterbrechung angefordert wurde. Wenn eine Unterbrechung angefordert wurde, wird ein throw :: thread_interrupted ausgeführt. Sie können einen eigenen Thread Klasse basierend auf std :: thread mit dem Mechanismus schreiben.

+2

Und vermutlich meine eigene Bedingung Unterklasse schreiben, so dass Thread weiß, worauf es wartet? Das klingt nach ein bisschen zu viel Arbeit für mich. – doublep

1

Tatsächlich bietet C++ 11 std :: thread keinen Standardmechanismus dafür (noch?). Daher entscheide ich mich bei second @ doublep vorerst dafür, boost :: thread zu verwenden.

Wir bevorzugen C++ 11 std :: facilities. Aber wir wollen nicht die terminate() Anlage von boost umbauen, komplett mit der Zustandsvariablen futzing um Schlaf usw. zu unterbrechen, ohne Grund. Erstellen von Infrastruktur wie das ist Spaß, und nicht so schwierig, aber unproduktiv und weniger Standard als mit Boost.

Es hilft, dass boost :: thread und std :: thread so ähnlich sind, dass wir das Gefühl haben, dass wir uns nicht in eine Ecke malen. (Wir erwarten, dass eine eventuelle Migration zu std. :: thread relativ einfach, vielleicht sogar trivial ist.)

Verwandte Themen