在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
究竟是什么?
答案 0 :(得分:1)
pthread_mutexattr_t
是一种不透明的类型(您永远不会直接修改它),它是通过各种pthread_mutexattr_get*()/set*()
函数访问的。除非这些函数的文档指定了默认值,否则默认值取决于实现,并且您不能依赖于特定值。
您可以点击POSIX.1-2008 here中各种pthread_mutexattr_get*()
函数的链接,查找默认值(当您为属性传递NULL
时也适用)。这里有一些选择引用:
pthread_mutexattr_getprotocol():
属性的默认值应为PTHREAD_PRIO_NONE。
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; /非递归。