什么是pthread_mutex的“默认互斥锁属性”**

时间:2015-04-14 09:57:03

标签: linux attributes pthreads 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,并且在书中也提到了{{ 1}},但在任何地方都没有详细解释,我用Google搜索,没有结果。

有一个帖子what is the "attribute" of a pthread mutex?,它提到“通常,默认是一组合理的属性,但它可能因平台而异”,但它不是我想要的,我想要更多细节。

那么,The Linux Programming Interface究竟是什么?

2 个答案:

答案 0 :(得分:1)

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

您可以点击POSIX.1-2008 here中各种pthread_mutexattr_get*()函数的链接,查找默认值(当您为属性传递NULL时也适用)。这里有一些选择引用:

pthread_mutexattr_getprotocol()

  

属性的默认值应为PTHREAD_PRIO_NONE。

pthread_mutexattr_gettype()

  

type属性的默认值是PTHREAD_MUTEX_DEFAULT。

pthread_mutexattr_getpshared()

  

属性的默认值应为PTHREAD_PROCESS_PRIVATE。

pthread_mutexattr_getrobust()

  

PTHREAD_MUTEX_STALLED ...这是默认值。

虽然非类型属性有点模糊。

答案 1 :(得分:0)

pthread_mutexattr_settype的手册页让我们开始了。它说" type属性的默认值是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,即&#34; fast&#34; /非递归。