1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <pthread.h>
5
6 typedef void* (*fun)(void*);
7
8 fun fun1, fun2;
9
10 pthread_mutex_t pmu = PTHREAD_MUTEX_INITIALIZER;
11 pthread_cond_t cond;
12 pthread_t pid1, pid2;
13 int flag = 0;
14 int gnum = 0;
15 int gsub = 100;
16
17 void * func1(void * para)
18 {
19 int k = (int)para;
20 printf("func1, ******\n");
21 while(gnum<=100)
22 {
23 pthread_mutex_lock(&pmu);
24 printf("gnum == %d", gnum);
25 while(gnum==50)
26 {
27 printf("suspend thread1 at gnum==50 !!! \n");
28 pthread_cond_wait(&cond, &pmu);
29 gnum++;
30 }
31 ++gnum;
32 ++flag;
33 ++k;
34 //printf("flag = %d, k = %d\n", flag, k);
35 pthread_mutex_unlock(&pmu);
36 printf("I am func1\n");
37 }
38 pthread_exit((void*)0);
39
40 }
41
42 void * func2(void * para)
43 {
44 int f = (int)para;
45 printf("f == %d\n", f);
46 printf("pthread2 start running !\n");
47 void * ret = NULL;
48 while(gsub>=0)
49 {
50 pthread_mutex_lock(&pmu);
51 gsub--;
52 printf("gsub= %d ", gsub);
53 if(gsub == 20)
54 {
55 printf("now gsnb ==20, and send signal\n");
56 pthread_cond_signal(&cond);
57 }
58 ++flag;
59 ++f;
60 printf("flag = %d, f = %d\n", flag, f);
61 pthread_mutex_unlock(&pmu);
62 printf("I am func2 \n");
63 }
64 //pthread_join(pid1, &ret);
65 pthread_exit((void*)0);
66 }
67
68 int main()
69 {
70 int id = 0;
71 void * ret = NULL;
72 int key = 5;
73
74 pthread_cond_init(&cond, NULL); //属性设置NULL默认属性
75 id = pthread_create(&pid1, NULL, func1, (void*)key);
76 if(id != 0)
77 {
78 printf("pthread_create error !\n");
79 exit(0);
80 }
81
82 if(pthread_create(&pid2, NULL, func2, (void*)key))
83 {
84 printf("pthread_create error ! \n");
85 exit(0);
86 }
87 pthread_join(pid2, &ret);
88 pthread_join(pid1, &ret);
89 pthread_exit((void*)0);
90 }
gcc test_thread.c -lpthread
./a.out
时间: 2024-10-24 11:54:31