互斥初始化 - (UNIX)

时间:2010-09-09 05:24:04

标签: c unix pthreads mutex

在以下代码中。互斥锁已初始化。 NULL 的重要性是什么。

pthread_mutex_init(&a->monitor,NULL);

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

3 个答案:

答案 0 :(得分:6)

第二个参数是指向pthread_mutexattr_t结构的指针,它允许您调整互斥锁的行为; NULL表示“此处没有特殊选项,请使用默认的互斥行为。”

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

答案 1 :(得分:4)

NULL作为互斥锁属性,为您提供实现定义的默认属性。如果您想知道如何处理属性,请查看following reference并按照pthread_mutexattr_*部分中的SEE ALSO链接进行操作。

这是针对标准的问题7,1003.1-2008。起点是here。点击左下角的Headers,您可以导航到特定功能(包括pthreads.h)。

属性允许您设置或获取:

  • type(死锁,死锁检测,递归等)。
  • robustness(当您获得互斥锁并且原始拥有者在拥有它时死亡时会发生什么情况。)
  • process-shared attribute(用于跨进程边界共享互斥锁)。
  • protocol(当优先级较高的线程需要互斥锁时,线程的优先级如何表现。)
  • priority ceiling(关键部分将运行的优先级,防止优先级倒置的方法)。

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

答案 2 :(得分:2)

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