Ich bin in einer Situation, in der ich einen binären Suchbaum (BST) in einem Signal-Handler lesen muss ( SIGSEGV Signal-Handler, der nach meinem Wissen pro Thread-Basis ist). Die BST kann von den anderen Threads in der Anwendung geändert werden.
Nun, da ein Signal-Handler keine Semaphore, Mutexe usw. verwenden kann und daher nicht auf geteilte Daten zugreifen kann, Wie löse ich dieses Problem? Beachten Sie, dass meine Anwendung Multithread ist und auf einem Multicore-System ausgeführt wird.
Sie sollten nicht auf freigegebene Daten vom Signal-Handler zugreifen. Sie können mehr Informationen über Signale in folgenden Artikeln finden:
Linux-Signale für den Anwendungsprogrammierer
Das Linux-Signal-Handling-Modell
Sieht so aus, als ob der sicherste Weg, mit Signalen in Linux umzugehen, signalfd ist.
Angenommen, der SH kann nicht direkt auf die geteilten Daten zugreifen, dann könnten Sie es vielleicht indirekt tun:
Wenn Sie sich Sorgen über überlappende SIGSEGVs machen, fügen Sie dem Mix einen Zähler hinzu, um den Überblick zu behalten. (Hey! Du hast gerade deinen eigenen Semaphor gebaut!)
Die schwache Verbindung hier ist offensichtlich die Abstimmung, aber es ist ein Anfang.
Ich kann zwei ziemlich saubere Lösungen sehen:
Sie könnten mmap in Erwägung ziehen, wenn Sie fuse Dateisystem (im Benutzerbereich).
Tatsächlich wirst du auf Gnu Hurd , die Unterstützung für externe Pager
Und vielleicht könnte Ihr Hack beim Lesen eines binären Suchbaums in Ihrem Signal-Handler oft in der Praxis funktionieren, nicht portabel und in einer Kernel-Versions-abhängigen Weise. Vielleicht Serialisierung des Zugriffs mit Low-Level nicht tragbaren Tricks (zB futexes und atomare gcc-Builtins ) könnte funktionieren. Das Lesen des (maschinenspezifischen) Quellcodes von NPTL, d. H. Aktuellen Linux-pthread-Routinen, sollte helfen.
Es könnte wahrscheinlich der Fall sein, dass pthread_mutex_lock
etc tatsächlich innerhalb eines Linux-Signal-Handlers verwendet werden kann (weil es wahrscheinlich nur futex
und atomare Anweisungen gibt).
Tags und Links c linux signals mutex signal-handling