Linux——进程(4)

一、线程控制:互斥与同步

  •     临界资源: 共享资源 
  •     临界区  : 一段代码区域(访问临界资源的那段代码)
  •     原子操作: 要么不操作,要操作,一定是一次完整的操作。不能被打断。

    1、概念

    互斥 :在多线程中对临界资源的排他性访问。

    互斥机制 (互斥锁 ):保证临界资源的访问控制。

    pthread_mutex_t           mutex;
    互斥锁类型                    互斥锁变量(内核对象)

    框架:
     定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
        ****                      ***      ***
      //互斥锁 互斥量 
       pthread_mutex_init(); //初始化一把锁 
       pthread_mutex_lock(); //上锁 
       pthread_mutex_unlock(); //解锁 
       pthread_mutex_destroy();//销毁一把锁 

二、互斥锁

1、定义

        pthread_mutex_t   mutex;

2、初始化锁

        int pthread_mutex_init( pthread_mutex_t *mutex,
                                              const pthread_mutexattr_t *attr);
        功能:将已经定义好的互斥锁初始化。
        参数:mutex 要初始化的互斥锁
                   atrr  初始化的值,
                   一般是NULL表示默认锁
        返回值:成功 0
                      失败 非零

3、加锁

        int pthread_mutex_lock(pthread_mutex_t *mutex);
   功能:用指定的互斥锁开始加锁代码
              加锁后的代码到解锁部分的代码属于原子操作,
              在加锁期间其他进程/线程都不能操作该部分代码
              如果该函数在执行的时候,mutex已经被其他部分
              使用则代码阻塞。

    参数: mutex 用来给代码加锁的互斥锁
     返回值:成功 0
                   失败 非零

4、解锁

        int pthread_mutex_unlock(pthread_mutex_t *mutex);
   功能:将指定的互斥锁解锁。
              解锁之后代码不再排他访问,一般加锁解锁同时出现。
   参数:用来解锁的互斥锁
   返回值:成功 0
                 失败 非零

5、销毁

         int pthread_mutex_destroy(pthread_mutex_t *mutex);
    功能:使用互斥锁完毕后需要销毁互斥锁
    参数:mutex 要销毁的互斥锁
    返回值:成功  0
                  失败  非零

6、trylock

        int pthread_mutex_trylock(pthread_mutex_t *mutex);
    功能:类似加锁函数效果,唯一区别就是不阻塞。
    参数:mutex 用来加锁的互斥锁
    返回值:成功 0
                  失败 非零

三、线程的同步 

  •    同步 :有 一定先后顺序的,对资源的排他性访问。
  •    互斥:在多线程中对临界资源的排他性访问。
  •    原因:互斥锁可以控制排他访问但没有次序。
  •    信号量 :实现线程间的同步.
  •    信号量 (个数) : 反映的是资源的数量

四、信号量

1、信号量的分类

    1)、信号无名量 :线程间通信
    2)、有名信号量 :进程间通信

2、框架

  •     信号量的定义     sem_t  sem      //造了一类资源 
  •     信号量的初始化   sem_init 
  •     信号量的PV操作  (核心) sem_wait()/ sem_post()
  •     信号量的销毁。   sem_destroy

3、信号量的定义 

       sem_t                 sem;
       信号量的类型     信号量的变量

4、信号量的初始化

        int sem_init(sem_t *sem, int pshared, unsigned int value);
   功能:将已经定义好的信号量赋值。
   参数:sem 要初始化的信号量
              pshared = 0 ;表示线程间使用信号量
              !=0 ;表示进程间使用信号量
              value 信号量的初始值,一般无名信号量
              都是二值信号量,0 1 
              0 表示红灯,进程暂停阻塞
              1 表示绿灯,进程可以通过执行
   返回值:成功  0
                 失败  -1;

5、信号量的PV 操作

       P (申请资源):申请一个二值信号量 
       V (释放资源):释放一个二值信号量

       P操作对应函数 :sem_wait();
       V操作对应函数 :sem_post();

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

          注意:sem 申请资源后会自动执行 sem = sem - 1;
  参数:sem 要判断的信号量资源
  返回值:成功 0 
                失败 -1
        
    int sem_post(sem_t *sem);         //V操作 
  功能:
          函数可以将指定的sem信号量资源释放
          并默认执行,sem = sem+1;
          线程在该函数上不会阻塞。
  参数:sem 要释放资源的信号量
  返回值:成功 0
                失败 -1;

5、信号量的销毁

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值