-
Erstellen Sie mit
pthread_join()
einen abgetrennten Thread, wenn Sie wissen, dass Sie nicht darauf warten möchten . Der einzige Leistungsvorteil besteht darin, dass beim Beenden eines getrennten Threads seine Ressourcen sofort freigegeben werden können, anstatt warten zu müssen, bis der Thread beigetreten ist, bevor die Ressourcen freigegeben werden können. -
Es ist 'legal', einem beitretbaren Thread nicht beizutreten; aber es ist normalerweise nicht ratsam, weil (wie bereits erwähnt) die Ressourcen nicht freigegeben werden, bis der Thread beigetreten ist, also bleiben sie auf unbestimmte Zeit gebunden (bis das Programm beendet wird), wenn Sie ihm nicht beitreten.
Wann sollte ich einen Thread von Anfang an als getrennt erstellen?
Immer wenn es der Anwendung egal ist, wann dieser Thread beendet wird, und sich auch nicht um seinen Rückgabewert eines Threads kümmert (ein Thread kann einen Wert über pthread_exit
an einen anderen Thread/eine andere Anwendung zurücksenden ).
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, getrennt zu erstellen Themen.
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?
Hinsichtlich der Leistung gibt es keinen Unterschied zwischen joinable Threads vs. getrennt Fäden. Der einzige Unterschied besteht darin, dass bei getrennten Threads deren Ressourcen (z. B. Thread-Stack und zugehöriger Heap-Speicher usw. - genau das, was diese "Ressourcen" ausmacht, implementierungsspezifisch sind).
Ist es legal, kein pthread_join() für einen beitretbaren (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. Beachten Sie jedoch, dass die erstellten Threads beitrittsfähig sind 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. Ein gutes Beispiel ist die Aufgabenfarmparallelität.
Oder sollte ein solcher Thread immer die Funktion disconnect() verwenden, bevor pthread_exit()ing?
Nicht nötig. Aber Sie möchten oft entscheiden, ob Sie ein Joinable möchten oder getrennt Thread zum Zeitpunkt der Erstellung.
Beachten Sie, dass zwar ein trennbarer Thread erstellt werden kann, indem Sie das Attribut PTHREAD_CREATE_DETACHED
setzen mit einem Aufruf an pthread_attr_setdetachstate
, kann eine Thread-Entscheidung jederzeit entscheiden, sich selbst zu trennen, z. mit pthread_detach(pthread_self())
. Auch ein Thread mit der Thread-ID (pthread_t
) eines anderen Threads kann mit pthread_detach(thread_id);
getrennt werden .