Erstellen und zerstören Sie viele Threads?
Die meisten pthread-Implementierungen fügen bei der Zuweisung des Stacks eines Threads eine "guard page" hinzu. Das ist eine zugriffsgeschützte Speicherseite, die dazu dient, Stack-Überläufe zu erkennen. Ich würde erwarten, dass mindestens ein Aufruf von mprotect jedes Mal erfolgt, wenn ein Thread erzeugt oder beendet wird, um die guard page zu (ent)schützen. Wenn dies der Fall ist, gibt es mehrere offensichtliche Strategien:
- Setzen Sie die Größe der Schutzseite auf Null mit
pthread_attr_setguardsize()
bevor Sie Threads erstellen.
- Verwenden Sie einen Thread-Pool (mit so vielen Threads wie es Prozessoren gibt). Sobald ein Thread mit einer Aufgabe fertig ist, geben Sie ihn an den Pool zurück, um eine neue Aufgabe zu erhalten, anstatt ihn zu beenden und einen neuen Thread zu erstellen.
Eine andere Erklärung könnte sein, dass Sie auf einer Plattform arbeiten, auf der der Stack eines Threads vergrößert wird, wenn ein Überlauf festgestellt wird. Ich glaube nicht, dass dies unter Linux mit GCC/Glibc bereits implementiert ist, aber es gab kürzlich einige Vorschläge in diese Richtung. Wenn Sie während der Verarbeitung viel Stack-Speicherplatz verwenden, können Sie die anfängliche/minimale Stack-Größe explizit erhöhen, indem Sie pthread_attr_setstacksize
.
Oder es könnte etwas ganz anderes sein!
0 Stimmen
Wie wäre es, Ihr Programm mit strace zu verfolgen, wenn Sie es haben (Linux).
0 Stimmen
Genau das habe ich getan.