Следующая программа показывает, что мы можем использовать return
или pthread_exit
, чтобы вернуть void *
переменная, доступная для переменной состояния pthread_join
.
Следует ли отдавать предпочтение использованию одного перед другим?
Почему возврат работает? Обычно мы думаем о возврате, помещающем значение в стек, но поскольку поток завершен, стек должен исчезнуть. Или стек не будет уничтожен до тех пор, пока не будет pthread_join
?
В вашей работе вы часто видите использование переменной состояния? Кажется, что 90% кода я вижу просто NULL из параметра статуса. Поскольку все, что было изменено через void *
ptr, уже отражено в вызывающем потоке, возвращать его не имеет особого смысла. Любой новый возвращенный void *
ptr должен будет указывать на что-то malloc
, созданное начальным потоком, что оставляет принимающий поток с ответственностью за его удаление. Я ошибаюсь, полагая, что переменная состояния полупустой?
Вот код:
#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;
}
С выводом:
before 10 10 Hello
after task1 35 5.5 Goodbye
after task2 10 10 World