• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > Linux线程管理必备:解析互斥量与条件变量的详解

Linux线程管理必备:解析互斥量与条件变量的详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了linux线程互斥锁,linux线程条件变量,linux 线程,linux线程间通信,linux线程编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

   做过稍微大一点项目的人都知道,力求程序的稳定性和调度的方便,使用了大量的线程,几乎每个模块都有一个专门的线程处理函数。而互斥量与条件变量在线程管理中必不可少,任务间的调度几乎都是由互斥量与条件变量控制。互斥量的实现与进程中的信号量(无名信号量)是类似的,当然,信号量也可以用于线程,区别在于初始化的时候,其本质都是P/V操作。编译时,记得加上-lpthread或-lrt哦。

   有关进程间通信(消息队列)见:进程间通信之深入消息队列的详解

一、互斥量

1. 初始化与销毁:

   对于静态分配的互斥量, 可以初始化为PTHREAD_MUTEX_INITIALIZER(等价于pthread_mutex_init(…, NULL))或调用pthread_mutex_init。

   对于动态分配的互斥量, 在申请内存(malloc)之后,通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy.

    int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t*restric attr);

    int pthread_mutex_destroy(pthread_mutex_t *mutex);

返回值:成功则返回0,出错则返回错误编号.

说明:1、如果使用默认的属性初始化互斥量,只需把attr设为NULL。

           2、销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。由于在Linux中,互斥锁并不占用任何资源,因此 LinuxThreads中的pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。

2. 互斥操作:

   对共享资源的访问, 要对互斥量进行加锁,如果互斥量已经上了锁, 调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后, 要对互斥量进行解锁。

    int pthread_mutex_lock(pthread_mutex_t *mutex);  //P操作:请求资源(+1)

    int pthread_mutex_trylock(pthread_mutex_t *mutex);

    int pthread_mutex_unlock(pthread_mutex_t *mutex);//V操作:释放资源(-1)

返回值:成功则返回0,出错则返回错误编号.

说明:1、想给一个互斥量上锁,我们调用pthread_mutex_lock。如果mutex已经上锁,调用的线程将会被阻塞,直至信号量解锁。

       2、具体说一下trylock函数, 这个函数是非阻塞调用模式,也就是说, 如果互斥量没被锁住,trylock函数将把互斥量加锁, 并获得对共享资源的访问权限;如果互斥量被锁住了,trylock函数将不会阻塞等待而直接返回EBUSY, 表示共享资源处于忙状态。

       3、要解锁一个信号量,我们调用phtread_mutex_unlock。

3. 死锁、同步、与互斥的关系

3.1 死锁:

   有时,可能需要同时访问两个资源。您可能正在使用其中的一个资源,随后发现还需要另一个资源。如果两个线程尝试声明这两个资源,但是以不同的顺序锁定与这些资源相关联的互斥锁,则会出现问题。例如,如果两个线程分别锁定互斥锁1 和互斥锁 2,则每个线程尝试锁定另一个互斥锁时,将会出现死锁。下面的例子说明了可能的死锁情况。

线程 1

线程 2

pthread_mutex_lock(&m1);

pthread_mutex_lock(&m2);

do something……

pthread_mutex_unlock(&m2);

pthread_mutex_unlock(&m1);

pthread_mutex_lock(&m2);

pthread_mutex_lock(&m1);

do something……

pthread_mutex_unlock(&m1);

pthread_mutex_unlock(&m2);


3.2 同步:  

线程 1

线程 2

pthread_mutex_lock(&m1);

do something……

pthread_mutex_unlock(&m2);

pthread_mutex_lock(&m2);

do something……

pthread_mutex_unlock(&m1);


3.3 互斥: 

线程 1

pthread_mutex_lock(&m1);

do something……//临界区(Critical Section)

pthread_mutex_unlock(&m1);


4. 互斥量之前辈总结

       1.对共享资源操作前一定要获得锁。

       2.完成操作以后一定要释放锁。

       3.尽量短时间地占用锁。

       4.如果有多锁, 如获得顺序是ABC连环扣,释放顺序也应该是ABC。

       5.线程错误返回时应该释放它所获得的锁。

二、条件变量

1. 创建和注销

    条件变量和互斥锁一样,都有静态动态两种创建方式

a. 静态方式

    静态方式使用PTHREAD_COND_INITIALIZER常量,如:&nb

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux线程管理必备:解析互斥量与条件变量的详解

相关文章

  • 2017-05-28C++ 中指针和引用有什么区别详解
  • 2017-05-28C++的static关键字及变量存储位置总结
  • 2017-05-28C语言使用DP动态规划思想解最大K乘积与乘积最大问题
  • 2017-05-28LintCode 堆化详解及实例代码
  • 2017-05-28c++中虚函数的实现详解
  • 2017-05-28Cocos2d-x中实现弹出对话框示例
  • 2017-05-28基于c++强制类型转换的(总结)详解
  • 2017-05-28C与C++中结构体的区别
  • 2017-05-28基于atoi()与itoa()函数的内部实现方法详解
  • 2017-05-28new和malloc的区别深入解析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • VC++ 中ListCtrl经验总结
    • 浅谈C语言编程中程序的一些基本的编写优化技巧
    • 深入Windows下的回车是回车换行(\r\n)还是换行回车(\n\r)的详解
    • c++ STL容器总结之:vertor与list的应用
    • 简要对比C语言中的setgid()函数和setregid()函数
    • mingw编译的windows命令行贪吃蛇示例
    • C++归并排序算法实例
    • c语言中if 语句的作用范围示例代码
    • C++ 简单的任务队列详解
    • 深入解析unsigned int 和 int

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有