【问题标题】:Mutex Initialization -(UNIX)互斥量初始化 - (UNIX)
【发布时间】:2010-09-09 05:24:03
【问题描述】:

在下面的代码中,初始化了一个mutexNULL的意义是什么。

pthread_mutex_init(&a->monitor,NULL);

我想知道为什么我们将 NULL 作为第二个参数传递。

【问题讨论】:

标签: c unix pthreads mutex


【解决方案1】:

第二个参数是指向pthread_mutexattr_t 结构的指针,它可以让您调整互斥体的行为; NULL 表示“这里没有特殊选项,使用默认的互斥体行为。”

大多数互斥锁选项仅在边缘情况下有用(避免优先级反转死锁,在进程而不是线程之间共享互斥锁),而更有用的选项(例如递归控制)仅在 POSIX 的 2008 修订版中标准化,这意味着你还不能依赖他们跨平台的存在。 paxdiablo 的答案有一个完整的列表。

【讨论】:

  • POSIX pthreads.h spec中有一个列表——查看pthread_mutexattr_开头的函数
  • 它们没有标准化得很差,IEEE/OG 与 ISO re 的标准相当。大多数时候,它没有用,你是对的。但是它们有个用途,无论它们可能是什么边缘情况。
  • 我一定是在查看旧版本的 1003.1,它只定义了 pshared 属性;所以我假设我系统上 (glibc) pthread.h 中的所有其他函数都是 GNU-only 扩展。我会将“标准差”修改为“不太便携”——不幸的是,仅在 1003.1-2008 中的任何东西都太新而无法依赖跨平台。
【解决方案2】:

NULL,作为互斥体属性,为您提供实现定义的默认属性。如果您想知道属性可以做什么,请查看following reference 并点击SEE ALSO 部分中的pthread_mutexattr_* 链接。

这是针对标准的第 7 版 1003.1-2008。起点是here。单击左下角的Headers 将允许您导航到特定功能(包括pthreads.h)。

属性允许你设置或获取:

  • type(死锁、死锁检测、递归等)。
  • robustness(当您获得一个互斥体并且原所有者在拥有它时死亡时会发生什么)。
  • process-shared attribute(用于跨进程边界共享互斥锁)。
  • protocol(当更高优先级的线程需要互斥锁时,线程在优先级方面的行为)。
  • priority ceiling(临界区运行的优先级,一种防止优先级倒置的方法)。

当然,还有init and destroy calls,它与特定属性没有直接关系,但用于创建它们。

【讨论】:

    【解决方案3】:

    pthread_mutex_init 的第二个参数以 pthread_mutexattr_t 作为参数。 您可以使用第二个参数来指定互斥体的属性以及是否使用其 NULL 默认互斥体属性。

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2013-01-15
      • 1970-01-01
      • 2021-06-11
      • 2020-08-07
      • 2013-05-12
      相关资源
      最近更新 更多