c многопоточным процессом - PullRequest
1 голос
/ 11 мая 2011

Я хочу написать многопоточную программу на языке c. Я использую библиотеку потоков posix.

Я пишу следующий код:

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

void *put (int *arg)
{
    int i;
    //int * p;
    // p=(int*)arg;
    for(i=0;i<5;i++)
    { 
        printf("\n%d",arg[i]);
    }
    pthread_exit(NULL);
}

int main()
{
    int a[5]={10,20,30,40,50};
    pthread_t s;
    pthread_create(&s,NULL,put,a);
    printf("what is this\n");
    return 0;
}

Я просто хочу, чтобы моя ветка просто показывала элементы в массиве. Программа составлена ​​со следующим предупреждением:

tm.c:19: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type
/usr/include/pthread.h:227: note: expected ‘void * (*)(void *)’ but argument is of type ‘void * (*)(int *)’

Когда я запускаю программу, я получаю выход основного потока, но не значение, сохраненное в массиве.

Теперь кто-нибудь может сказать мне, что я делаю не так? Как отправить массив в качестве аргумента в функции потока?

Если я просто немного изменил код, предупреждение о времени компиляции разрешило измененный код:

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


void *put (void *arg)
{
    int i;
    int * p;
    p=(int*)arg;
    for(i=0;i<5;i++)
    { 
        printf("\n%d",p[i]);
    }
    pthread_exit(NULL);
}

int main()
{
    int a[5]={10,20,30,40,50};
    pthread_t s;
    pthread_create(&s,NULL,put,a);
    printf("what is this\n");
    return 0;
}

Но вывод не меняется. Кто-нибудь может сказать мне, что я сделал не так? Как правильно отправлять массив в функцию потока (в этом случае)?

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

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

0 голосов
/ 11 мая 2011

Постарайтесь дождаться выполнения потока, добавьте

pthread_join(s, NULL);

перед вашим return 0;

0 голосов
/ 11 мая 2011

Прежде всего, вам нужно дождаться окончания потока, прежде чем вернуться из main().

Другая проблема с этим кодом состоит в том, что массив a размещен в стеке подпрограммы main() и, таким образом, потенциально недопустим в контексте другого потока. Вы должны выделить кучу a при вызове malloc().

Если вы ожидаете окончания потока в main(), то, вероятно, a допустим, так как кадр стека для main() все еще будет существовать. Однако любой будущий рефакторинг может вызвать у вас горе, поэтому, пожалуйста, переключитесь на использование malloc().

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