12.3 进程和线程传递数据、多线程编程

  我们在进程中给线程传递数据,程序如下:

 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是一样的),执行结果如下:

注意:线程体函数中传出的数据不能是在线程体中的局部变量。

一般情况下,线程的运算结果需要告诉父进程,即可用这种方法传出来。

多线程编程:

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9452593.html