• linux io 学习笔记(01)---锁,信号量


    1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源。

    2.sudo  dmesg -c 消除dmesg缓冲

    3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性

    4.自旋锁:轮循

    5.读写锁:奇偶

    6.顺序锁:读写可并发,但是会检测信号

          互斥锁中:

              死锁:(1)互斥锁交叉嵌套

                 (2)同一个互斥锁嵌套使用

                 (3)占有锁资源的任务被异常退出,锁资源不会释放,比如,一个线程开了一个锁,还没来得及解锁,线程就被取消了。

              避免死锁:申请锁,按顺序加锁,以防死锁。

    7,锁和信号量不一样,比如要顺序执行时。

    1).初始化互斥锁

        函数原型:  int pthread_mutex_init(pthread_mutex_t *restrict mutex,

                            const pthread_mutexattr_t *restrict attr);

          功能:  初始化互斥锁

          参数:   mutex   互斥锁的标识符

                attr       互斥锁的属性    NULL

          返回值:  成功:0

                失败 :错误码

    2):执行上锁:

        函数原型:int pthread_mutex_lock(pthread_mutex_t *mutex);

        功能:  执行上锁操作

        参数:   mutex   互斥锁的标识符

        返回值:  成功 0

               失败:错误码

    3):执行解锁

        函数原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);

        功能:执行解锁操作

        参数: mutex 互斥锁的标识符

        返回值:成功 0 ;失败:错误码;

    4):释放锁资源:

        函数原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);

         功能:  摧毁锁资源

          参数: mutex互斥锁的标识符

         返回值: 成功0

              失败:错误码

    信号量:

    申请信号量:p操作   -1

    释放信号量:v操作  +1

    当执行任务,申请信号量时,如果当前信号量的值大于0,申请成功,信号量减一,不大于0 则申请失败。会阻塞。

    1)初始化信号量的值

        int   sem_init(sem_t *sem, int pshread,unsigned int value);

          功能: 初始化信号量

           参数:sem 信号量的标识符

               pashred  0  用于线程间

                    非0  用于进程间

                value      信号量的初始值

           返回值: 成功    0

                失败   -1

    2)申请信号量

        int sem_wait(sem_t *sem);

          功能:申请信号量,信号量的值-1;

          参数:sem 信号量的标识符

          返回值:成功    0

              失败  -1

    3)释放信号量

        int sem_post(sem_t *sem);

           功能:释放信号量   信号量的值+1;

            参数:sem  信号量的标识符

            返回值  成功   0

                失败  -1

    4)摧毁信号量

        int sem_destroy(sem_t *sem);

          参数:  sem 信号量的标识符

          返回值: 成功   0

              失败  -1

    5)获取当前信号量的值

        int sem_getvalue(sem_t *sem,int  *sval);

          参数: sem:信号量的标识符

              sval  保存当前信号量的值。

  • 相关阅读:
    LTE问题集锦(0)
    LTE问题集锦(3)
    LTE问题集锦(2)
    LTE问题集锦(1)
    LTE学习之路(9)—— 3GPP TS协议系列总结
    (原创)我的测试生涯(2)——《Clearcase UCM Practice》
    我的测试生涯(1)——开篇《Clearcase简介》
    (转载)十年、五年,你该做的事
    (转载)Windows消息机制
    LTE学习之路(8)——信令流程
  • 原文地址:https://www.cnblogs.com/jiaan/p/9392236.html
Copyright © 2020-2023  润新知