2016-07-11 2 views
-1

Я ищу pthread на C. Так что я новичок. Я пытаюсь изучить синтаксис и роли указателей в коде pthread. Может ли кто-нибудь сказать мне, какие мои ошибки в соответствии с кодом? Я не могу понять, что я сделал.pthread библиотека базовый пример не работает должным образом

Когда я пытаюсь проверить возвращаемое значение pthread_create() Я получаю неправильные/случайные значения.

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

int *f_1,*f_2,*f_3,*f_4; 

void p1(void *a); 
void p2(void *a); 
void p3(void *a); 
void p4(void *a); 

int main(void){ 
pthread_t thread_1, thread_2, thread_3, thread_4; 
int *x=1,*y=2,*z=3,*w=4; 

f_1=pthread_create(&thread_1, NULL, p1,(void *)x); 
f_2=pthread_create(&thread_2, NULL, p2,(void *) y); 
f_3=pthread_create(&thread_3, NULL, p1,(void *) z); 
f_4=pthread_create(&thread_4, NULL, p1,(void *) w); 

pthread_join(thread_1,NULL); 
pthread_join(thread_2,NULL); 
pthread_join(thread_3,NULL); 
pthread_join(thread_4,NULL); 


printf("Hi! From %d. thread!",f_1); 
printf("Hi! From %d. thread!",f_2); 
printf("Hi! From %d. thread!",f_3); 
printf("Hi! From %d. thread!",f_4); 

return 0; 
} 
void p1(void *a){ 
f_1=(int *)a; 
} 

void p2(void *a){ 
f_2=(int *)a; 
} 

void p3(void *a){ 
f_3=(int *)a; 
} 

void p4(void *a){ 
f_4=(int *)a; 
} 
+0

'Я не могу понять, ясно, что я сделал. Вопрос ... тогда как вы это сделали? –

+0

Можете ли вы хотя бы объяснить, что вы * пытались * делать, и какие * конкретные * проблемы, возникающие у вас с этим кодом? –

+0

С некоторых сайтов, но он не был скомпилирован. – QatarNotAlone

ответ

0

pthread_create() возвращает int, вы пытаетесь сохранить, что в int * (указатель). Это поведение, определяемое реализацией.

f_1=pthread_create(&thread_1, NULL, p1,(void *)x); 
f_2=pthread_create(&thread_2, NULL, p2,(void *) y); 
f_3=pthread_create(&thread_3, NULL, p1,(void *) z); 
f_4=pthread_create(&thread_4, NULL, p1,(void *) w); 

Далее вы используете %d для печати указателей,

printf("Hi! From %d. thread!",f_1); 
printf("Hi! From %d. thread!",f_2); 
printf("Hi! From %d. thread!",f_3); 
printf("Hi! From %d. thread!",f_4); 

который вызывающую undefined behavior.

Для решения вышеуказанных проблем все ваши f_n переменные должны быть int типа, а не int * s.

Тем не менее, прототип функции для функций Нить

void *(*start_routine) (void *) 

, которая является функцией возвращения void * и приняв void *. Вы можете изменить подпись функции и определение своих функций потока в соответствии с этим.

+0

вы говорите, что я не могу вернуть значение из суб-fuctions, с pthread_create()? – QatarNotAlone

+0

@outSider Я говорю о возвращаемом значении самого вызова функции 'pthread_create()', см. Связанную страницу man. –

+0

ОК, я попробую сейчас. – QatarNotAlone

Смежные вопросы