pthread互斥体的"属性"是什么?

vy3*_*y32 25 attributes mutex pthreads

函数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);
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 36

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

一个NULL互斥锁属性为您提供了一个实现定义的默认属性.如果您想知道如何处理属性,请查看以下参考资料,并按照pthread_mutexattr_*SEE ALSO节中的链接进行操作.通常,默认值是一组合理的属性,但它可能因平台而异,因此我更愿意显式创建具有已知属性的互斥锁(更好的可移植性).

这是针对标准的问题7,即1003.1-2008.起点就在这里.单击Headers左下角将允许您导航到特定功能(包括pthreads.h).

这些属性允许您设置或获取:

  • 类型(死锁,死锁检测,递归的,等等).
  • 鲁棒性(当你获得一个互斥锁,并同时具有它原来的主人死了,会发生什么).
  • 进程共享的属性(用于共享跨进程边界互斥).
  • 协议(一个线程,当更高优先级的线程要互斥的优先级方面的行为).
  • 优先级上限(在此临界部分将运行优先级,防止优先级倒置的一种方式).

而且,为了完整性,还有init和destroy调用,与特定属性没有直接关系,但用于创建它们.


Lor*_*nzo 6

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

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);
Run Code Online (Sandbox Code Playgroud)

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

int pthread_mutexattr_getname(const pthread_attr_t *attr, Type *t);
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)