pthread互斥体的“属性”是什么?

时间:2010-11-23 01:50:15

标签: attributes pthreads mutex

函数pthread_mutex_init允许您指定指向属性的指针。但我还没有找到pthread属性的详细解释。我总是提供NULL。这个论点有用吗?

文档,对于那些忘记它的人:

  

PTHREAD_MUTEX_INIT(3)BSD Library   功能手册
  调用pthread_mutex_init(3)

     

NAME        pthread_mutex_init - 创建一个互斥锁

     

概要

 #include <pthread.h>

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

说明        pthread_mutex_init()函数使用属性创建一个新的互斥锁   规定        与attr。如果attr为NULL,则使用默认属性。

4 个答案:

答案 0 :(得分:34)

查找该信息的最佳位置来自POSIX标准页面。

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,与特定属性没有直接关系,但用于创建它们。

答案 1 :(得分:4)

所有互斥锁属性都通过以下形式的函数在互斥锁属性对象中设置:

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);

通过以下形式的函数从互斥锁属性对象中检索所有互斥锁属性:

int pthread_mutexattr_getname(const pthread_attr_t *attr, Type *t);

其中name和Type的定义如下表所示:

Type and Name   Description and Value(s)
int protocol    Define the scheduling classes for mutex locks 
                PTHREAD_PRIO_NONE,PTHREAD_PRIO_PROTECT,
                PTHREAD_PRIO_INHERIT

int pshared Defines whether a mutex is shared with other processes. 
                PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_PRIVATE

int prioceiling Used for mutex attribute priority ceiling values. 
                See POSIX.1 section 13

int type    Application defined mutex locking
                PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_RECURSIVE,
                PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_DEFAULT

答案 2 :(得分:1)

如果向下滚动<pthread.h>的功能列表,您会发现一堆pthread_mutexattr_...个功能,包括initdestroy和设置各种属性的功能一个互斥体。当您传递NULL时,会为所有这些属性创建具有合适默认值的互斥锁,但如果您需要修改特定属性,则可以构造pthread_mutexattr_t结构并将其传入。

答案 3 :(得分:0)

对此参数应用NULL意味着使用默认参数。 因此,出于某些原因,您可能希望更改这些默认设置(使用pthread_mutexattr_init)。

文档说明了有关这些互斥锁设置的所有信息。