Linux系统编程:线程 (3)

1.临界资源

    临界区: 访问临界资源的那段代码

   原子操作 :访问的完整性

2.信号量

   强调的是线程的顺序问题

    信号量    //交通信号灯      //实现一种可以让线程间有序访问临界资源的方式。

    信号量 --- 可以顺序操作一把锁

     1.信号量的机制

       1.信号量 --- 来描述 可使用的资源的个数

       2.p操作         表示使用这个资源   资源个数减一

       3.v操作         表示产生这个资源    资源个数加一

     2.信号量的初始化:

功能:将已经定义好的信号量赋值

参数:sem   要初始化的信号量

            pshared = 0;表示线程间使用信号量

            pshared != 0;表示进程间使用信号量

           value 信号量的初始值,一般无名信号量

           都是二值信号量 ,0 1

           0 表示红灯,进程暂停阻塞

           1  表示绿灯,进程可以通过执行

 返回值:  成功  : 0                   失败 :-1

  2.sem_wait 函数

  

功能:
          判断当前sem信号量是否有资源可用。
          如果sem有资源(==1),则申请该资源,程序继续运行
          如果sem没有资源(==0),则线程阻塞等待,一旦有资源
          则自动申请资源并继续运行程序。

          注意:sem 申请资源后会自动执行 sem = sem - 1;
    参数:sem 要判断的信号量资源
    返回值:成功 0 
            失败 -1

 3.sem_post函数

    

   功能:
          函数可以将指定的sem信号量资源释放
          并默认执行,sem = sem+1;
          线程在该函数上不会阻塞。
    参数:sem 要释放资源的信号量
    返回值:成功 0
            失败 -1;

 4.sem_destroy函数

   

  功能:使用完毕将指定的信号量销毁
       参数:sem要销毁的信号量
       返回值:成功 0
                失败  -1;

  

3.进程间的通信

  1.古老的通信方式

     管道:无名管道

                有名管道

     信号

   2.IPC对象通信      system  v    BSD      suse  fedora           karnel.org

                消息队列 

                共享内存(*)  //最高效

                信号量集()  //信号量

   3.socket通信 

                 网络通信

                1.无名管道

                  

                 功能:
                           创建一个管道 
                  参数:
                           @pipefd //用来获取 管道的两端 //读端pipefd[0] 
                                       //写端pipefd[1]

                             返回值:
                                             成功 0
                                             失败 -1 && errno  
      

管道的特点:
   1.管道大小 65536字节   64k 
   2.管道操作特点 
     数据读走之后,认为就没了 
     
     //写端存在,读端也存在 
     管道如果为空,此时可以一直写,直到写满     
     
     //写端存在,读端不存在 
     此时,写操作,会导致管道破裂 
     SIGPIPE //这个信号会使得程序结束 
     
     
     //写端存在,读管道 
     可以读管道,但是管道中如果没有数据了,此时读操作 阻塞 
     
     //写端不存在,读管道 
     可以读管道,但是管道中如果没有数据了,此时读操作 不阻塞 
    
    
    
    管道的读写规则:
    1.读端存在,写管道
      管道空:可以写数据
      管道满:会造成-->写阻塞 
    
    2.读端不存在,写管道
      系统会给进程发一个信号SIGPIPE(管道破裂)

    3.写端存在,读管道
      管道空,读不到数据,
      这时会造成读操作阻塞

    4.写端不存在,读管道 
      如果管道中有数据,则读取这些数据!
      如果没有数据,读操作不阻塞,立即返回!
    

    

      

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值