一、线程的创建等待及退出
1 #include <stdio.h>
2 #include <pthread.h>
3
4 //int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); 线程创建
5
6 void *func1(void *arg)
7 {
8 //static int ret = 10;
9 static char *p = "ti is run out"; //记住要加static不然函数一调用就没调了,p会出现乱码
10
11 //pthread_t pthread_self(void); 线程ID获取
12 printf("ti:%ld\n",(unsigned long)pthread_self());
13 printf("ti:create successful %d\n",*(int *)arg);
14 //pthread_exit((void *)&ret);
15
16 //int pthread_exit(void *rval_ptr); 线程退出
17 pthread_exit((void *)p);
18 }
19
20
21 int main()
22 {
23 int ret;
24 pthread_t t1;
25
26
27 int prarm = 100;
28 // int *prd = NULL;
29 char *prd = NULL;
30 //取地址后转换成void型传参
31 ret = pthread_create(&t1,NULL,func1,(void *)&prarm);
32
33 if(ret == 0){
34
35 printf("main:create successful \n");
36
37 }
38
39 printf("main:%ld\n",(unsigned long)pthread_self());
40
41 //int pthread_join(pthread_t thread, void **rval_ptr); 线程等待
42
43 pthread_join(t1,(void **)&prd); //线程等待不然不会运行到线程主线程就退出了
44 //printf("pthread is quit%d\n",*prd);
45 printf("pthread is quit %s\n",prd);
46 return 0;
47 }
二、线程的加锁解锁
#include <stdio.h>
2 #include <pthread.h>
3 #include <unistd.h>
4
5 //int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); 线程创建
6 int g_data = 0;
7
8 pthread_mutex_t mutex;
9
10 void *func1(void *arg)
11 {
12 pthread_mutex_lock(&mutex);
13
14 printf("t1:%ld\n",(unsigned long)pthread_self());
15 printf("t1:create successful %d\n",*(int *)arg);
16
17 pthread_mutex_unlock(&mutex);
18 }
19
20 void *func2(void *arg)
21 {
22 pthread_mutex_lock(&mutex);
23
24 printf("t2:%ld\n",(unsigned long)pthread_self());
25 printf("t2:create successful %d\n",*(int *)arg);
26
27 pthread_mutex_unlock(&mutex);
28 }
29
30 int main()
31 {
32 int ret;
33 pthread_t t1;
34 pthread_t t2;
35 int prarm = 100;
36
37 pthread_mutex_init(&mutex,NULL);
38 //取地址后转换成void型传参
39 ret = pthread_create(&t1,NULL,func1,(void *)&prarm);
40
if(ret == 0){
42
43 printf("main1:create successful \n");
44
45 }
46 ret = pthread_create(&t2,NULL,func2,(void *)&prarm);
47
48 if(ret == 0){
49
50 printf("main2:create successful \n");
51
52 }
53
54 printf("main:%ld\n",(unsigned long)pthread_self());
55
56 //int pthread_join(pthread_t thread, void **rval_ptr); 线程等待
57 pthread_join(t1,NULL);
58 pthread_join(t2,NULL);
59
60 pthread_mutex_destroy(&mutex);
61 return 0;
62 }
三、什么情况下会照成死锁
1、条件:需要两把锁
2、两个线程互相锁住对方。
四、实现线程同步
#include <stdio.h>
2 #include <pthread.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 int g_data = 0;
6
7 pthread_mutex_t mutex;
8 pthread_cond_t cond;
9
10 void *func1(void *arg)
11 {
12 printf("t1:%ld\n",(unsigned long)pthread_self());
13 printf("t1:create successful %d\n",*((int *)arg));
14
15 while(1){
16
17 pthread_cond_wait(&cond,&mutex); //等待
18 printf("t1 = %d\n",g_data);
19 sleep(1);
20 printf("t=3 quit\n");
21 exit(-1);
22 }
23 }
24
25 void *func2(void *arg)
26 {
27 printf("t2:%ld\n",(unsigned long)pthread_self());
28 printf("t2:create successful %d\n",*((int *)arg));
29
30 while(1){
31
32 pthread_mutex_lock(&mutex); //创建互斥锁
33 printf("t2:%d\n",g_data);
34 g_data++;
35 if(g_data == 3){
36 pthread_cond_signal(&cond); //触发
37 }
38
39 pthread_mutex_unlock(&mutex); //销毁互斥锁
40 sleep(1);
41 }
}
43
44 int main()
45 {
46 int ret;
47 pthread_t t1;
48 pthread_t t2;
49 int prarm = 100;
50
51 pthread_mutex_init(&mutex,NULL);
52 pthread_cond_init(&cond,NULL); //创建条件变量
53 ret = pthread_create(&t1,NULL,func1,(void *)&prarm);
54
55
56 ret = pthread_create(&t2,NULL,func2,(void *)&prarm);
57
58
59
60
61
62 //int pthread_join(pthread_t thread, void **rval_ptr); 线程等待
63 pthread_join(t1,NULL);
64 pthread_join(t2,NULL);
65
66 pthread_mutex_destroy(&mutex);
67 pthread_cond_destroy(&cond); //销毁条件变量
68 return 0;
69 }