2015-04-14 62 views
2

在像pthread_mutex_init接口手冊頁,什麼是「默認互斥鎖屬性」的pthread_mutex **

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中也提到了它,但是它從未在任何地方詳細解釋過,我使用Google並沒有結果。

有一個帖子what is the "attribute" of a pthread mutex?,它提到「通常情況下,默認值是一組明智的屬性,但它可能因平臺而異」,但這不是我想要的,我想了解更多細節。

那麼,究竟是什麼default mutex attributes

回答

1

pthread_mutexattr_t是一種不透明類型(您從不直接修改它),它可以通過各種功能訪問。除非這些函數的文檔指定了默認值,否則默認值取決於實現,並且不能依賴特定的值。

您可以按照指向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 ......這是默認值。

雖然非類型屬性有點不明顯。

0

pthread_mutexattr_settype的手冊頁讓我們開始。它說「類型屬性的默認值是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,即「快速「/非遞歸。