вопрос о pthread_join () и pthread_detach () - PullRequest
0 голосов
/ 17 декабря 2018

Я написал эту программу, чтобы практиковать системные вызовы pthread, поэтому я использовал несколько строк печати, чтобы проверить результаты, но они экранировались:

Thread 1 created Thread 2 created test3

, хотя я думаю, что это должноbe

thread 1 created test2 thread 2 created test3 test1 Порядок может измениться, но у меня должны быть эти строки, так почему он избегает этих операторов печати?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>



void *function();
void *function2();




int main(int argc, char *argv[])
{
    pthread_t tid;
    int rc;
    rc = pthread_create(&tid, NULL, function(), NULL);
    if(rc > 0){
        fprintf(stderr, "Error\n");
        exit(1);
    }
    pthread_join(tid, NULL);
    sleep(1);
    printf("test1\n");
    pthread_exit(NULL);
}

void *function(){
    int rc;
    pthread_t tid;
    printf("Thread 1 created\n");
    rc = pthread_create(&tid, NULL, function2(), NULL);
    if(rc > 0){
        fprintf(stderr, "Error\n");
        exit(1);
    }
    printf("test2\n");
    pthread_exit(NULL);
}

void *function2(){
    pthread_detach(pthread_self());
    printf("Thread 2 created\n");
    printf("test3\n");
    pthread_exit(NULL);
}

1 Ответ

0 голосов
/ 17 декабря 2018
rc = pthread_create(&tid, NULL, function(), NULL);

Вы пытаетесь вызвать pthread_create() с указателем, возвращаемым путем вызова function() в качестве функции для запуска в новом потоке (помните, что аргументы функции оцениваются до вызова самой функции).Теперь function() на самом деле не возвращает никакого значения, но вызывает в своем теле function2() (при оценке аргументов для другого вызова pthread_create()), что также не возвращает никакого значения, но делает вызов pthread_exit().Поскольку в этот момент существует только один поток, поскольку выполняется только основной поток процесса (pthread_create() на самом деле еще не был вызван; стек вызовов выглядит как main() -> function() -> function2()), вся программа завершается.

Вам нужно позвонить pthread_create() с указателями на function и function2, а не с результатами их вызова:

rc = pthread_create(&tid, NULL, function, NULL);

и т. Д.

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