return () versus pthread_exit () in pthread start functions

Das folgende Programm zeigt, dass wir return () oder pthread_exit () verwenden können, um eine void * -Variable zurückzugeben, die für die Statusvariable von pthread_join () verfügbar ist.

(1) Sollte es eine Präferenz für die Verwendung eines über dem anderen geben?

(2) Warum funktioniert return ()? Normalerweise denken wir daran, einen Wert in den Stapel zurückzugeben, aber da der Thread abgeschlossen ist, sollte der Stapel verschwinden. Oder wird der Stack erst nach pthread_join () zerstört?

(3) Sehen Sie in Ihrer Arbeit viel Gebrauch von der Statusvariablen? Es sieht so aus, als ob 90% des Codes, den ich sehe, nur den Statusparameter NULL enthält. Da sich alles, was sich über das void * ptr geändert hat, bereits im aufrufenden Thread widerspiegelt, scheint es nicht sinnvoll, es zurückzugeben. Jedes neue void * ptr, das zurückgegeben wird, müsste auf etwas verweisen, das vom Start-Thread verfälscht wurde, und den empfangenden Thread dazu verpflichten, es zu entsorgen. Habe ich mich geirrt, wenn ich die Statusvariable für halb sinnlos halte?

#include <iostream>
#include <pthread.h>

using namespace std;

struct taskdata
{
       int  x;
     float  y;
    string  z;
};


void* task1(void *data)
{
    taskdata *t = (taskdata *) data;

    t->x += 25;
    t->y -= 4.5;
    t->z = "Goodbye";

    return(data);
}

void* task2(void *data)
{
    taskdata *t = (taskdata *) data;

    t->x -= 25;
    t->y += 4.5;
    t->z = "World";

    pthread_exit(data);
}


int main(int argc, char *argv[])
{
    pthread_t threadID;

    taskdata t = {10, 10.0, "Hello"};

    void *status;

    cout << "before " << t.x << " " << t.y << " " << t.z << endl;

    //by return()

    pthread_create(&threadID, NULL, task1, (void *) &t);

    pthread_join(threadID, &status);

    taskdata *ts = (taskdata *) status;

    cout << "after task1 " << ts->x << " " << ts->y << " " << ts->z << endl;

    //by pthread_exit()

    pthread_create(&threadID, NULL, task2, (void *) &t);

    pthread_join(threadID, &status);

    ts = (taskdata *) status;

    cout << "after task2 " << ts->x << " " << ts->y << " " << ts->z << endl;

}

Mit Ausgabe von:

before 10 10 Hello
after task1 35 5.5 Goodbye
after task2 10 10 World

Antworten auf die Frage(4)

Ihre Antwort auf die Frage