LINUX.ORG.RU

[C] Как получить статус завершения треда

 


0

0

Здравствуйте!

Не могу понять как правильно вернуть из треда его статус завешения и как этот статус получить в main().

pthread_exit() или return из треда должны возвращать указатель на void. Но при этом переменная не может быть локальной, в итоге остаётся либо возвращать адрес глобальной переменной, либо выделять память на куче и возращать адрес на неё.

Второе очень странно и не логично, потому что городить вызовы malloc(), и потом free() в главном потоке, только для того чтобы только получить код завершения это overhead.

А если возвращать указатель на глобальную переменную, то какой смысл в этих pthread_exit() если можно просто установить глобальную переменную в нужнозе значение и всё?

Как-то нелогично IMHO сделано. Объясните, пожалуйста.

P.S. Был в гугле со словами "pthread_exit() get status"

★★★★★

> А если возвращать указатель на глобальную переменную

a pochemu net?


static const int internal_error = -12;
static const int normal_error = -10;
static const int success = 1;

void* routine_x(void *arg_in)
{
    int *arg = (int*)arg_in;

    // do something here

    if(something_very_bad_has_happened)
    {
        pthread_exit((void*)&internal_error);
    }
    else if(normal_failure)
    {
        return ((void*)&normal_error);
    }

    return ((void*)&success);
}

int main()
{
    pthread_t thread;
    void *status;
    int arg = 5;

    pthread_create(&thread, NULL, routine_x, &arg);

    pthread_join(thread, &status);

    if(*status == PTHREAD_CANCELED)
    {
        printf("thread was canceled\n");
    }
    else
    {
        printf("thread completed. exit status: %ld\n", *((int*)status));
    }

    return 0;
}

ska
()

передвать в функцию потока указатель на объект структуры, которая содержит поле для кода возврата

rei3er
()

Вот:

dmvo@cipher:/tmp$ cat c.c
#include <stdio.h>
#include <pthread.h>

void *t(void *_)
{
        return (void *) 0x17;
}

int main()
{
        pthread_t tid;
        void *result;

        pthread_create(&tid, NULL, t, NULL);
        pthread_join(tid, &result);
        printf("0x%x\n", (int) result);

        return 0;
}
dmvo@cipher:/tmp$ cc c.c -lpthread
dmvo@cipher:/tmp$ ./a.out
0x17
dmvo@cipher:/tmp$

Или Вы хотите вернуть данных больше, чем помещается в void *?

DmVo
()
Ответ на: комментарий от DmVo

> Или Вы хотите вернуть данных больше, чем помещается в void*? А какие проблемы? Перед выходом создать объект в куче, привести указатель на него к void*, вернуть указатель, в основной программе выполнить обратное приведение, попользовать объект, удалить его. Не знаю, Ъ это, или !Ъ, но сам так делал не раз.

one_more_hokum ★★★
()
Ответ на: комментарий от rei3er

> передвать в функцию потока указатель на объект структуры, которая содержит поле для кода возврата

Я бы тоже так сделал.

smh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.