linux线程(学习笔记)

一、线程的创建等待及退出

 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 }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值