Реализация функции соединения в библиотеке потоков пользовательского уровня - PullRequest
1 голос
/ 28 сентября 2011

Я пытаюсь реализовать библиотеку потоков пользовательского уровня как часть проекта. Я сосредоточен на функции соединения. Допустим, что Thread1 вызывает функцию соединения в Thread2. Что мне нужно сделать, это получить возвращаемое значение / аргумент, предоставленный pthread_exit () из Thread2, и сохранить его в ячейке памяти, указанной в аргументе функции соединения.

Но как мне получить возвращаемое значение другого потока?

Любая помощь будет оценена. Спасибо

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Вот пример, взятый из библиотеки потоков пользовательского уровня GnuPth (pth_lib.c), которая показывает реализацию функций exit и join соответственно. Я упростил код, чтобы выделить обработку возвращаемого значения.

void pth_exit(void *value)
{
    pth_debug2("pth_exit: marking thread \"%s\" as dead", pth_current->name);

    /* the main thread is special, because its termination
       would terminate the whole process, so we have to delay 
       its termination until it is really the last thread */

    /* execute cleanups */

    /*
     * Now mark the current thread as dead, explicitly switch into the
     * scheduler and let it reap the current thread structure; we can't
     * free it here, or we'd be running on a stack which malloc() regards
     * as free memory, which would be a somewhat perilous situation.
     */
    pth_current->join_arg = value;
    pth_current->state = PTH_STATE_DEAD;

    pth_debug2("pth_exit: switching from thread \"%s\" to scheduler", pth_current->name);

    //return (for ever) to the scheduler
}

и соответствующий pth_join:

/* waits for the termination of the specified thread */
int pth_join(pth_t tid, void **value)
{      
    //Validate thread situation.

    //wait until thread death

    //save returned value for the caller
    if (value != NULL)
        *value = tid->join_arg;

    //remove thread from the thread queue

    //free its memory space

    return TRUE;
}
2 голосов
/ 28 сентября 2011

Вы можете создать хранилище для возвращаемого значения в контексте приложения или процесса, инициализированного при инициализации библиотеки потоков.Ваш pthread_exit будет заполнять значение, а ваше объединение будет использовать threadid для его получения - я думаю, что это будет работать только для нединамически распределенных возвращаемых значений.

1 голос
/ 28 сентября 2011

Меня интересует метаинформация для отдельного потока в вашей реализации. Возвращаемое значение может быть одним из элементов, хранящихся в потоке, кроме идентификатора, указателя стека и т. Д.

Когда вызывается pthread_exit (), такая информация должна быть выгружена в одну или несколько структур данных планировщиком, чтобы другой поток мог обращаться к ним при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...