Тело резьбы не выполнено - PullRequest
0 голосов
/ 26 марта 2012

Я написал этот код:

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

void* cuoco(void* arg)
{
    fprintf(stderr,"Inizio codice cuoco\n");
    fprintf(stderr,"Fine codice cuoco\n");
    return NULL;
}

void* cameriere(void* arg)
{
    fprintf(stderr,"Inizio codice cameriere\n");
    fprintf(stderr,"Fine codice cameriere\n");
    return NULL;
}

void* cliente(void* arg)
{
    fprintf(stderr,"Inizio codice cliente\n");
    fprintf(stderr,"Fine codice cliente\n");
    return NULL;
}

int main(int argc, char* argv[])
{
    void* (*routine)(void*);
    void* result;
    routine=cuoco;
    pthread_t thread_cuoco,thread_cameriere,thread_cliente;
    pthread_create(&thread_cuoco,NULL,routine,*argv);
    return 0;
}

Просто чтобы проверить, как работают потоки. Но тело функции cuoco никогда не выполняется. Это потому, что она должна печатать "Inizio codice cuoco" и "Fine Codice Cuoco"."но это не так.

Ответы [ 2 ]

8 голосов
/ 26 марта 2012

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

pthread_create(&thread_cuoco,NULL,routine,*argv);

int res = pthread_join(thread_cuoco, NULL);
0 голосов
/ 26 марта 2012

Проблема в том, что ваш основной поток возвращается из main, который уничтожает весь процесс и уничтожает все потоки. Возвращение с main похоже на вызов exit.

В качестве альтернативы использованию pthread_join вы можете завершить ваш основной поток вызовом pthread_exit. Вызов pthread_exit прервет только основной поток.

Потоковое приложение POSIX продолжает работать до тех пор, пока не завершатся все его потоки или пока не завершится процесс.

(Если присоединяемые потоки не собираются с помощью pthread_join, это может вызвать утечку ресурсов, но это не проблема в вашей программе или вообще для потоков, которые сохраняются до конца приложения. Тем не менее, это хорошо " программирование "сделать каждый такой поток, который не будет присоединен, отдельным потоком.)

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