一个pthread互斥锁的"attribute"是什么?

31

函数pthread_mutex_init允许您指定一个指向属性的指针。但是我还没有找到一个好的解释来说明pthread属性是什么。我总是只提供NULL。这个参数有用吗?

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

PTHREAD_MUTEX_INIT(3) BSD库 函数手册
PTHREAD_MUTEX_INIT(3)

名称 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个回答

45
最好的地方是从POSIX标准页面获取该信息。
一个NULL互斥属性会给你一个实现定义的默认属性。如果你想知道可以使用哪些属性,请查看以下参考文献并在SEE ALSO部分中跟随pthread_mutexattr_*链接。通常,默认值是一组合理的属性,但在不同平台上可能会有所不同,因此我更喜欢明确创建具有已知属性的互斥体(更适用于可移植性)。
这是标准第7版,1003.1-2008的问题。起点在这里。在左下角点击Headers将允许您导航到特定功能(包括pthreads.h)。
这些属性允许您设置或获取:
  • 类型(死锁、死锁检测、递归等)。
  • 鲁棒性(当您获取互斥锁并且原始所有者在拥有它时死亡会发生什么)。
  • 进程共享属性(用于跨进程边界共享互斥锁)。
  • 协议(当更高优先级的线程想要互斥锁时,线程行为方面的优先级)。
  • 优先级天花板(关键部分将运行的优先级,一种防止优先级反转的方法)。

此外,为了完整起见,还有初始化和销毁调用,虽然与特定属性无直接关系,但用于创建它们。


7

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

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);

所有的互斥锁属性都可以通过以下形式的函数从互斥锁属性对象中获取:

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

其中名称和类型的定义如下表:

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

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

0

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

文档解释了有关这些互斥设置的所有内容。


10
如果文档有用的话,就不需要提出这个问题了。:-) 在我发现这个答案之前,我已经花了大约一个小时来寻找相同问题的答案。 - Head Geek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接