linux多线程编程——同步与互斥

本文介绍了Linux环境下多线程编程中同步与互斥的重要性,通过一个模拟售票系统的例子展示了线程同步问题,然后通过互斥锁、信号量和条件变量三种方式演示了解决线程同步的方法,确保了线程安全地销售票务资源。
摘要由CSDN通过智能技术生成

我们在前面文章中已经分析了多线程VS多进程,也分析了线程的使用,现在我们来讲解一下linux多线程编程之同步与互斥。

现在,我们不管究竟是多线程好还是多进程好,先讲解一下,为什么要使用多线程?

一、 为什么要用多线程技术?

1、避免阻塞,大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。

2、避免CPU空转,应用程序经常会涉及到RPC,数据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。

3、提升效率,一个进程要独立拥有4GB的虚拟地址空间,而多个线程可以共享同一地址空间,线程的切换比进程的切换要快得多。

二、  如何使用多线程技术进行编程?

下面给出个多线程程序,一个最简单的模拟售票系统,代码如下:

[cpp]  view plain   copy
  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3.   
  4. void *ticketsell1(void *);  
  5. void *ticketsell2(void *);  
  6. int tickets = 20;  
  7.   
  8. int main()  
  9. {  
  10.     pthread_t id1,id2;  
  11.     int error;  
  12.   
  13.     error = pthread_create(&id1, NULL, ticketsell1, NULL);  
  14.     if(error != 0)  
  15.     {  
  16.         printf("pthread is not created!\n");  
  17.         return -1;  
  18.     }  
  19.   
  20.     error = pthread_create(&id2, NULL, ticketsell2, NULL);  
  21.     if(error != 0)  
  22.     {  
  23.         printf("pthread is not created!\n");  
  24.         return -1;  
  25.     }  
  26.   
  27.     pthread_join(id1,NULL);  
  28.     pthread_join(id2,NULL);  
  29.       
  30.     return 0;  
  31. }  
  32.   
  33. void *ticketsell1(void *arg)  
  34. {  
  35.     while(1)  
  36.     {  
  37.         if(tickets > 0)  
  38.         {  
  39. //          usleep(1000);  
  40.             printf("ticketse1 sells ticket:%d\n",tickets--);  
  41.         }  
  42.         else  
  43.         {  
  44.             break;  
  45.         }  
  46.     }  
  47.     return (void *)0;  
  48. }  
  49.   
  50. void *ticketsell2(void *arg)  
  51. {  
  52.     while(1)  
  53.     {  
  54.         if(tickets > 0)  
  55.         {  
  56. //          usleep(1000);  
  57.             printf("ticketse2 sells ticket:%d\n",tickets--);  
  58.         }  
  59.         else  
  60.         {  
  61.             break;  
  62.         }  
  63.     }  
  64.   
  65.     return (void *)0;  
  66. }  

执行结果如下:

[cpp]  view plain   copy
  1. fs@ubuntu:~/qiang/mthread$ ./mthread1   
  2. ticketse2 sells ticket:20  
  3. ticketse2 sells ticket:19  
  4. ticketse2 sells ticket:18  
  5. ticketse2 sells ticket:17  
  6. ticketse2 sells ticket:16  
  7. ticketse2 sells ticket:15  
  8. ticketse2 sells ticket:14  
  9. ticketse2 sells ticket:13  
  10. ticketse2 sells ticket:12  
  11. ticketse2 sells ticket:11  
  12. ticketse2 sells ticket:10  
  13. ticketse2 sells ticket:9  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值