Ich benutze die pthread
Bibliothek zum Erstellen und Verbinden von Threads in C.
-
Wann sollte ich einen Thread von Anfang an als losgelöst anlegen? Bietet es einen Leistungsvorteil gegenüber einem verbindbaren Thread?
-
Ist es legal, a pthread_join()
in einem beitretbaren (standardmäßig) Thread? Oder sollte man so einen Thread immer benutzen detach()
Funktion vor pthread_exit()
ing?
Wann sollte ich einen Thread von Anfang an als losgelöst anlegen?
Immer wenn es der Anwendung egal ist, wann dieser Thread abgeschlossen ist, und sich auch nicht um den Rückgabewert eines Threads kümmert (ein Thread kann einen Wert an einen anderen Thread/eine andere Anwendung über pthread_exit
).
Beispielsweise kann in einem Client-Server-Anwendungsmodell ein Server einen neuen Thread erstellen, um jede Anforderung zu verarbeiten. Aber der Server selbst kümmert sich nicht um den Rückgabewert des Threads. In diesem Fall ist es sinnvoll, zu erstellen losgelöst Fäden.
Der Server muss lediglich sicherstellen, dass die aktuell verarbeiteten Anfragen abgeschlossen werden. Was es tun kann, indem es einfach den Hauptthread beendet, ohne das gesamte Programm/die gesamte Anwendung zu beenden. Wenn der letzte Thread im Prozess beendet wird, wird die Anwendung/das Programm natürlich beendet.
Der Pseudocode könnte wie folgt aussehen:
/* A server application */
void process(void *arg)
{
/* Detach self. */
pthread_detach(pthread_self());
/* process a client request. */
pthread_exit(NULL);
}
int main(void)
{
while (not_done) {
pthread_t t_id;
errno = pthread_create(&t_id, NULL, process, NULL);
if (errno) perror("pthread_create:");
}
/* There may be pending requests at this point. */
/* Just exit the main thread - not the whole program - so that remaining
requests that may still be processed can continue. */
pthread_exit(NULL);
}
Ein weiteres Beispiel könnte ein Daemon oder Logger-Thread sein, der einige Informationen in regelmäßigen Abständen protokolliert, solange die Anwendung läuft.
Bietet es einen Leistungsvorteil gegenüber einem verbindbaren Thread?
Leistungsmäßig gibt es keinen Unterschied zwischen vereinbar Fäden vs losgelöst Fäden. Der einzige Unterschied besteht darin, dass bei getrennten Threads deren Ressourcen (z. B. Thread-Stack und zugehöriger Heap-Speicher usw.) implementierungsspezifisch sind.
Ist es legal, kein pthread_join() für einen verknüpfbaren (standardmäßig) Thread auszuführen?
Ja, es ist legal, einem Thread nicht beizutreten. pthread_join
ist eine einfache Komfortfunktion, die auf keinen Fall verwendet werden muss, es sei denn, Sie brauchen es. Aber beachten Sie, dass die Threads erstellt werden vereinbar Threads standardmäßig.
Ein Beispiel, wenn Sie beitreten möchten, ist, wenn Threads ein „Stück“ Arbeit erledigen, das zwischen ihnen aufgeteilt wird. In diesem Fall sollten Sie alle Threads auf Vollständigkeit überprüfen, bevor Sie fortfahren. Task-Farm-Parallelität ist ein gutes Beispiel.
Oder sollte ein solcher Thread vor dem pthread_exit()ing immer die disconnect()-Funktion verwenden?
Nicht nötig. Aber Sie möchten oft entscheiden, ob Sie eine möchten vereinbar oder losgelöst Thread zum Zeitpunkt der Erstellung.
Beachten Sie, dass zwar ein trennbarer Thread erstellt werden kann, indem Sie das Attribut festlegen PTHREAD_CREATE_DETACHED
mit einem Anruf bei pthread_attr_setdetachstate
ein Thread kann sich jederzeit zB mit entscheiden, sich abzumelden pthread_detach(pthread_self())
. Auch ein Thread mit der Thread-ID (pthread_t
) eines anderen Threads kann sich mit lösen pthread_detach(thread_id);
.