加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux的多线程编程的高效开发经验

发布时间:2016-01-26 08:25:17 所属栏目:Linux 来源:网络整理
导读:简介:本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验, 用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿 插一些 Windo

Linux 线程编程中的 5 条经验

尽量设置 recursive 属性以初始化 Linux 的互斥变量

互斥锁是多线程编程中基本的概念,在开发中被广泛使用。其调用次序层次 清晰简单:建锁,加锁,解锁,销毁锁。但是需要注意的是,与诸如 Windows 平台的互斥变量不同,在默认情况下,Linux 下的同一线程无法对同一互斥锁进 行递归加速,否则将发生死锁。

所谓递归加锁,就是在同一线程中试图对互斥锁进行两次或两次以上的行为 。其场景在 Linux 平台上的代码可由清单 1 所示。

清单 1. Linux 重复对互斥锁加锁实例

// 通过默认条件建锁
  pthread_mutex_t *theMutex = new pthread_mutex_t;
  pthread_mutexattr_t attr;
  pthread_mutexattr_init(&attr);
  pthread_mutex_init(theMutex,&attr);
  pthread_mutexattr_destroy(&attr);

  // 递归加锁
  pthread_mutex_lock (theMutex);
  pthread_mutex_lock (theMutex);
  pthread_mutex_unlock (theMutex);
  pthread_mutex_unlock (theMutex);

在以上代码场景中,问题将出现在第二次加锁操作。由于在默认情况下, Linux 不允许同一线程递归加锁,因此在第二次加锁操作时线程将出现死锁。

Linux 互斥变量这种奇怪的行为或许对于特定的某些场景会所有用处,但是 对于大多数情况下看起来更像是程序的一个 bug 。毕竟,在同一线程中对同一 互斥锁进行递归加锁在尤其是二次开发中经常会需要。

这个问题与互斥锁的中的默认 recursive 属性有关。解决问题的方法就是显 式地在互斥变量初始化时将设置起 recursive 属性。基于此,以上代码其实稍 作修改就可以很好的运行,只需要在初始化锁的时候加设置一个属性。请看清单 2 。

清单 2. 设置互斥锁 recursive 属性实例

pthread_mutexattr_init(&attr);
  // 设置 recursive 属性
  pthread_mutexattr_settype (&attr,PTHREAD_MUTEX_RECURSIVE_NP);
  pthread_mutex_init(theMutex,&attr);

因此,建议尽量设置 recursive 属性以初始化 Linux 的互斥锁,这样既可 以解决同一线程递归加锁的问题,又可以避免很多情况下死锁的发生。这样做还 有一个额外的好处,就是可以让 Windows 和 Linux 下让锁的表现统一。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读