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  保存当前信号量的值。

linux io 学习笔记(01)---锁,信号量的更多相关文章

  1. Linux Basic学习笔记01

    介绍课程: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.Shell脚本: 高级: MySQL数据库: cache & storage 集群: Cluster lb: 4laye ...

  2. linux io 学习笔记(02)---条件变量,管道,信号

    条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t  定 ...

  3. linux c学习笔记----互斥锁属性

    转自:http://lobert.iteye.com/blog/1762844 互斥锁属性 使用互斥锁(互斥)可以使线程按顺序执行.通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程. ...

  4. linux io 学习笔记(03)---共享内存,信号灯,消息队列

    system V IPC 1)消息队列 2)共享内存 3)信号灯(信号量集) 1.消息队列. ipcs -q 查看系统中使用消息队列的情况 ipcrm -q +msqid 删除消息队列 消息队列工作原 ...

  5. linux shell 学习笔记01

    1.命令历史记录history !$     :调用上一条命令的执行结果 !100   :运行history记录里的第100条命令 !ser   :调用以ser开头的最后一次执行的命令 ctrl+r  ...

  6. linux kernel学习笔记-5内存管理_转

    void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...

  7. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  8. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

  9. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

随机推荐

  1. pl/sql中的一种链接数据库方式

    今天看开发人员如此连接数据库:

  2. 一、OSI模型

    OSI/RM协议是由ISO(国际标准化组织)制定的,它有三个基本的功能:提供给开发者一个必须的.通用的概念以便开发完善.可以用来解释连接不同系统的框架.OSI将计算机网络体系结构(architectu ...

  3. Windows安装时的几个命令(摘录)

    Windows无法安装到这个磁盘.选中的磁盘采用GPT分区形式. 1.在系统提示无法安装的那一步,按住“shift+f10”,呼出“cmd”命令符. 2.输入:diskpart,回车.进入diskpa ...

  4. 「Luogu-U18201」分析矿洞

    题目 没有看懂题目呢说的是什么,但是我们要求的是这个式子 \[Ans=\sum_{i=1}^n\sum_{j=1}^n\varphi(gcd^2(i,j))\] 看起来挺鬼畜的是吧 老方法枚举\(gc ...

  5. 【洛谷P1288】取数游戏II

    取数游戏II 题目链接 显然,由于一定有一个0,我们可以求出从初始点到0的链的长度 若有一条链长为奇数,则先手可以每次取完一条边上所有的数, 后手只能取另一条边的数,先手必胜: 反之若没有奇数链,后手 ...

  6. Android学习笔记_55_Tween动画 (渐变、缩放、位移、旋转)

    Android 平台提供了两类动画. 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变).第二类就是 Frame动画,即顺序的播放事先做好的图像,与gi ...

  7. mysql 统一字符编码

    配置文件中的注释可以有中文,但是配置项中不能出现中文 #在mysql的解压目录下,新建my.ini,然后配置 #1. 在执行mysqld命令时,下列配置会生效,即mysql服务启动时生效 [mysql ...

  8. Mac使用GNU版本的sed

    今天在mac下用sed试图替换\t ,结果发现不生效,Google之后发现mac作为unix分支的系统上的sed与GNU版本的sed行为不太一致. 使用以下命令安装GNU命令套件: brew inst ...

  9. Restframework中常见API的编写方式

    1.框架一(继承APIView) 这里的第一部分使用骨架请参考我的博客(第三篇),它采用了restframework中最基础的办法(APIView)实现了相关请求,以下的框架都是基于它的 2.框架二( ...

  10. 字段中有空的时候 进行逻辑运算,mysql 与 oracle 处理函数IFNULL() 与 nvl() ,选取NULL 值 。

    mySQL数据库: SELECT id_p,IFNULL(math,0)+IFNULL(english,0) 总分 from mytest_brian1 Oracle 数据库: select  id_ ...