Ich glaube nicht, dass dies ein Duplikat ist. Ich habe eine sehr spezifische Frage darüber, was mit anderen Threads passiert, wenn ein Signalhandler aufgerufen wird.Linux: Effekt des Signals auf mehrere Threads
Ich habe ein Multithread-Programm, das mit Hardware spielt. Beim Abrufen von SIGTERM (von einem Elternprozess) möchte ich, dass der Signalhandler den Zustand der Hardware auf einen bestimmten Zustand setzt und exit (1). Ich verstehe, dass, da ich nicht mit Signalmasken spielte, der Haupt-Thread das Signal verarbeiten wird. Aber es ist ein Multiprozessorsystem (raspberry pi) und die anderen Threads laufen alle mit hoher Priorität relativ zu main. Sie schlafen wahrscheinlich, aber sie könnten auch Hardware berühren.
Wenn alle anderen Threads bei der Ankunft eines Signals einfrieren, geht es mir gut - ich rufe exit() direkt vom Signalhandler auf und die anderen Threads werden nie wieder laufen. Aber wenn sie unabhängig voneinander laufen können, könnten sie sich mit der Hardware herumärgern, nachdem ich den gewünschten Zustand im Handler eingestellt habe, aber bevor ich mich beende. Und ich kann keine Dokumentation finden, die den Effekt beschreibt. Wenn "alles außer dem Signalhandler" nicht standardmäßig eingestellt ist, gibt es eine Möglichkeit, dieses Verhalten zu erhalten?
Ich kann den Code neu entwerfen, um die ganze Hardware-Handhabung in einen Thread zu bringen, und diesen Thread die Interrupts behandeln lassen, aber es ist unbequem - das Thread-Layout habe ich jetzt eine gute Arbeitsteilung und jeder Thread weiß, welche Hardware es kann berühren und wann. Ich würde lieber nicht neu gestalten.
Nehmen Sie einfach nicht, dass "haben Ihre Signal-Handling-Thread die Sperre erwerben" kann nicht im Signal-Handler getan werden, obwohl ein Mutex ist nicht sicher in einem Signal-Handler zu verwenden. – nos
@nos Guter Punkt.Es wäre besser, wenn der Signal-Handler ein Flag gesetzt und der Rest nach der Rückkehr vom Signal-Handler ausgeführt wird. –
Das war, wovor ich Angst hatte. Ich wusste, dass ich die Mutex-Lösung nicht machen konnte (und eine meiner Ängste ist, dass wiringPi einen Mutex unter den Abdeckungen verwendet, was jede Lösung, die den Hardware-Zugriff nicht unmöglich macht, unmöglich macht.) Ich werde es wahrscheinlich tun müssen Redesign. Vielen Dank. – user15001