pthread_mutex 的 "default mutex attributes" 是什么**

What is the "default mutex attributes" of the pthread_mutex**

pthread_mutex_init

等界面的手册页中
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
          const pthread_mutexattr_t *restrict attr);

上面写着“如果attr为NULL,则使用默认的互斥属性...”,the default mutex attributes提到了很多次,也提到了在书中The Linux Programming Interface,但从来没有在任何地方详细解释,我用谷歌搜索没有结果。

有一个postwhat is the "attribute" of a pthread mutex?,里面提到了"Usually, the default is a sensible set of attributes but it may vary between platforms",但这不是我想要的,我想要更详细的

那么,default mutex attributes到底是什么?

pthread_mutexattr_t 是一种不透明类型(您永远不会直接修改它),可通过各种 pthread_mutexattr_get*()/set*() 函数访问。除非这些函数的文档指定了默认值,否则默认值取决于实现,您不能依赖特定值。

您可以点击 POSIX.1-2008 here 中各种 pthread_mutexattr_get*() 函数的链接并查找默认值(当您通过 NULL 属性)。这里有一些选择报价:

pthread_mutexattr_getprotocol():

The default value of the attribute shall be PTHREAD_PRIO_NONE.

pthread_mutexattr_gettype():

The default value of the type attribute is PTHREAD_MUTEX_DEFAULT.

pthread_mutexattr_getpshared():

The default value of the attribute shall be PTHREAD_PROCESS_PRIVATE.

pthread_mutexattr_getrobust():

PTHREAD_MUTEX_STALLED ... This is the default value.

虽然非类型属性有点晦涩难懂。

pthread_mutexattr_settype 的手册页帮助我们入门。它说 "The default value of the type attribute is PTHREAD_MUTEX_DEFAULT." 不幸的是它继续说 PTHREAD_MUTEX_DEFAULT 没有真正定义,可以是任何东西。

我写了一个简短的 C++ 程序来仔细看看:

#include <pthread.h>
#include <iostream>

int main (int, char**)
{
  std::cout<<"PTHREAD_MUTEX_NORMAL = "<<PTHREAD_MUTEX_NORMAL<<std::endl
       <<"PTHREAD_MUTEX_ERRORCHECK = "<<PTHREAD_MUTEX_ERRORCHECK<<std::endl
       <<"PTHREAD_MUTEX_RECURSIVE = "<<PTHREAD_MUTEX_RECURSIVE<<std::endl
       <<"PTHREAD_MUTEX_DEFAULT = "<<PTHREAD_MUTEX_DEFAULT<<std::endl;

}

这给了我以下输出:

PTHREAD_MUTEX_NORMAL = 0
PTHREAD_MUTEX_ERRORCHECK = 2
PTHREAD_MUTEX_RECURSIVE = 1
PTHREAD_MUTEX_DEFAULT = 0

所以至少在我的系统上默认是 PTHREAD_MUTEX_NORMAL,即 "fast" / non-recursive。