我们在进程中给线程传递数据,程序如下:
1 #include <unistd.h> 2 #include <sys/types.h> 3 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <errno.h> 7 #include <string.h> 8 #include <pthread.h> 9 /* 10 int pthread_create(pthread_t *restrict thread, 11 const pthread_attr_t *restrict attr, 12 void *(*start_routine)(void*), void *restrict arg); 13 */ 14 15 int g_num = 0; 16 typedef struct _Teacher 17 { 18 char name[64]; 19 int age; 20 }Teacher; 21 22 void *start_routine(void *arg) 23 { 24 int i = 0; 25 Teacher *pt = (Teacher *)arg; 26 printf("name : %s\n", pt->name); 27 printf("age : %d\n", pt->age); 28 29 pthread_detach(pthread_self()); 30 31 printf("thread id = %lu\n", pthread_self()); 32 33 for(i = 0; i < 10; i++) 34 { 35 printf("B"); 36 fflush(stdout); 37 } 38 39 sleep(3); 40 41 printf("\n"); 42 43 pthread_exit(NULL); 44 } 45 46 int main() 47 { 48 pthread_t thread; 49 int i = 0; 50 51 g_num = 10; 52 53 Teacher t = {"zhang", 10}; 54 55 pthread_create(&thread, NULL, start_routine, &t); 56 57 for(i = 0; i< 10; i++) 58 { 59 printf("A"); 60 fflush(stdout); 61 } 62 printf("\n"); 63 64 pthread_join(thread, NULL); 65 printf("child thread die\n"); 66 67 return 0; 68 }
执行结果如下:
从线程体中将数据传出来,通过pthread_exit函数,程序如下:
1 #include <unistd.h> 2 #include <sys/types.h> 3 4 #include <stdlib.h> 5 #include <stdio.h> 6 #include <errno.h> 7 #include <string.h> 8 #include <pthread.h> 9 /* 10 int pthread_create(pthread_t *restrict thread, 11 const pthread_attr_t *restrict attr, 12 void *(*start_routine)(void*), void *restrict arg); 13 */ 14 15 int g_num = 0; 16 typedef struct _Teacher 17 { 18 char name[64]; 19 int age; 20 }Teacher; 21 22 void *start_routine(void *arg) 23 { 24 int i = 0; 25 Teacher *pt = (Teacher *)arg; 26 printf("name : %s\n", pt->name); 27 printf("age : %d\n", pt->age++); 28 29 pthread_detach(pthread_self()); 30 31 for(i = 0; i < 10; i++) 32 { 33 printf("B"); 34 fflush(stdout); 35 } 36 37 sleep(2); 38 39 printf("\n"); 40 41 pthread_exit(arg); 42 } 43 44 int main() 45 { 46 pthread_t thread; 47 int i = 0; 48 49 g_num = 10; 50 51 Teacher t = {"zhang", 10}; 52 53 pthread_create(&thread, NULL, start_routine, &t); 54 55 for(i = 0; i< 10; i++) 56 { 57 printf("A"); 58 fflush(stdout); 59 } 60 printf("\n"); 61 62 Teacher *p = NULL; 63 64 pthread_join(thread, (void **)&p); 65 printf("name : %s\n", p->name); 66 printf("age : %d\n", p->age); 67 68 return 0; 69 }
第41行将arg传出来了(41行使用return arg是一样的),执行结果如下:
注意:线程体函数中传出的数据不能是在线程体中的局部变量。
一般情况下,线程的运算结果需要告诉父进程,即可用这种方法传出来。
多线程编程: