Проблема при компиляции программы pthreads - PullRequest
0 голосов
/ 15 декабря 2010

Я попытался скомпилировать эту простую программу pthreads с помощью этой команды

$ gcc -pthread -o pthreads pthreads.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

void *myThread(void *arg);

int main()
{
    pthread_t mythread;
    int ret;

    ret = pthread_create( &mythread, NULL, myThread, NULL );

    if (ret != 0){
        printf( "Can't create pthread: %s", strerror(errno));
        exit(-1);
    }
    return 0;
}

void *myThread(void *arg){

    // Thread code goes here..
    printf("OK! NOW ON THE THREAD\n");
    pthread_exit(NULL);
}

но при попытке ./pthreads вывод не получен !!

Ответы [ 4 ]

6 голосов
/ 15 декабря 2010

Вам нужно дождаться окончания потока.В противном случае вы рискуете выйти до того, как поток начнет выполняться.

... 
pthread_create( &mythread, NULL, myThread, NULL );
...
// Wait for the thread to finish.
pthread_join( mythread, NULL);
1 голос
/ 15 декабря 2010

Ответ Санджита, безусловно, правильный, но ради расширения набора инструментов темы вы можете также взглянуть на pthread_barrier_wait.Когда у вас есть простая программа с большим количеством потоков и main выглядит как «запустить все рабочие потоки и дождаться их завершения», использование main и всех рабочих, просто ожидающих барьер, может быть хорошим способом избежать необходимостисохранить все идентификаторы рабочих потоков и объединить их в цикл for.У барьеров также есть много других полезных применений, которые иногда позволяют избежать ненужных сложностей при выполнении одних и тех же вещей с мьютексами и переменными условий.

1 голос
/ 15 декабря 2010

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

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

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

void *myThread(void *arg);

int main()
{
    void* thread_return;
    pthread_t mythread;
    int ret;

    ret = pthread_create(&mythread, NULL, myThread, NULL);
    if (ret != 0)
    {
        printf("Can't create pthread: %s\n", strerror(errno));
        exit(-1);
    }

    ret = pthread_join(mythread, &thread_return);
    if (ret != 0)
    {
        printf("Can't join pthread: %s\n", strerror(errno));
        exit(-1);
    }

    return 0;
}

void *myThread(void *arg)
{
    printf("OK! NOW ON THE THREAD\n");
    pthread_exit(NULL);
}
1 голос
/ 15 декабря 2010

Вы не ждали, когда закончится ваша тема. Вам нужно использовать pthread_join ().

...