Überstehe ich die Signalblockierung pro Thread?

8

In meinen Anwendungen möchte ich generell die Signale SIGINT und SIGTERM abfangen, um ordnungsgemäß zu schließen.

Um zu verhindern, dass Worker-Threads Signale "stehlen", mache ich das im Entry-Point für jedes:

%Vor%

Wenn ich nicht, wenn ich Strg + C ausführe, meine Handler in der Zeit (es ist nicht angegeben, welcher Thread das Signal erhalten wird) Base-Thread wird nicht aufgerufen - stattdessen beendet das Signal den Prozess nur innerhalb des Worker-Threads. Das ist offensichtlich nicht cool.

Ich habe also einen Signalverarbeitungs-Thread und blockiere Signale überall sonst.

Allerdings merke ich nicht, dass das jemand anderes tut, es ist leicht genug zu vergessen, und es ist auch nicht ganz tragbar. Gibt es einen einfacheren Trick, den ich vermisse?

Referenzen:

Lightness Races in Orbit 21.11.2012, 17:01
quelle

1 Antwort

4
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123pthreads ___ PThreads (POSIX-Threads) ist eine standardisierte C-basierte API zum Erstellen und Bearbeiten von Threads. Es wird derzeit von POSIX.1-2008 definiert (IEEE Std 1003.1, Ausgabe 2013 / Die Open Group Base Specifications Ausgabe 7). ___ antwort13503100 ___

Ich finde es eine vollkommen vernünftige Sache zu tun.

Sie können die Signale in main blockieren, bevor ein anderer Thread erzeugt wird. Die erzeugten Threads übernehmen die Ersteller-Thread-Signalmaske, und Sie können die Signale nur im Signalhandling-Thread entsperren (Vorsicht nur, wenn dieser Thread auch andere Threads erzeugt).

Oder Sie können die Signale überall blockieren lassen und sie explizit über sigwait und Freunde im Signalhandling-Thread behandeln.

    
___ qstntxt ___

In meinen Anwendungen möchte ich generell die Signale %code% und %code% abfangen, um ordnungsgemäß zu schließen.

Um zu verhindern, dass Worker-Threads Signale "stehlen", mache ich das im Entry-Point für jedes:

%Vor%

Wenn ich nicht, wenn ich Strg + C ausführe, meine Handler in der Zeit (es ist nicht angegeben, welcher Thread das Signal erhalten wird) Base-Thread wird nicht aufgerufen - stattdessen beendet das Signal den Prozess nur innerhalb des Worker-Threads. Das ist offensichtlich nicht cool.

Ich habe also einen Signalverarbeitungs-Thread und blockiere Signale überall sonst.

Allerdings merke ich nicht, dass das jemand anderes tut, es ist leicht genug zu vergessen, und es ist auch nicht ganz tragbar. Gibt es einen einfacheren Trick, den ich vermisse?

Referenzen:

___ tag123boostthread ___ Boost.Thread ermöglicht die Verwendung mehrerer Ausführungsthreads mit gemeinsam genutzten Daten in portablem C ++ - Code. ___ qstnhdr ___ Überstehe ich die Signalblockierung pro Thread? ___
chill 21.11.2012, 22:28
quelle

Tags und Links