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.
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。
在 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.
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。