2015-11-13 23 views
1

當我再次初始化同一互斥體變量時會發生什麼? 根據調用pthread_mutex_init()手冊頁 - http://linux.die.net/man/3/pthread_mutex_init再次初始化同一個互斥體

應該失敗,並將errno設置爲EBUSY

爲什麼我看不到這種行爲?下面的代碼執行得很好。

lock = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); 
if (pthread_mutex_init((pthread_mutex_t*)lock, NULL) != 0) 
{ 
    printf("\n mutex init failed\n"); 
    return 1; 
} 

if (pthread_mutex_init((pthread_mutex_t*)lock, NULL) != 0) 
{ 
    printf("\n mutex init failed %d\n", errno); 
    return 1; 
} 

在此先感謝!

+0

爲什麼要這樣做? –

+0

我只是想刺激一個我在一個集成系統中獲得EBUSY的情況。 – Coder

回答

5

請注意,它表示「如果...」,pthread_mutex_init()函數可能會失敗。這意味着執行不需要執行這些檢查,顯然你的不執行。

看看錯誤的corresponding POSIX page的名單:

的調用pthread_mutex_init()函數失敗,如果:

[EAGAIN] 系統缺乏必要的資源(除內存)來初始化另一個互斥鎖。

[ENOMEM] 內存不足以初始化互斥鎖。

[EPERM] 調用者沒有執行操作的權限。

的調用pthread_mutex_init()函數可以失敗,如果:

[EBUSY] 實施已檢測到嘗試重新初始化由互斥引用的對象,一個先前初始化,但尚未被破壞,互斥。

[EINVAL] attr指定的值無效。

您會注意到​​處於「可能失敗」部分。所以這不是一個保證,而只是一個實施允許的事情。

對於那些不習慣閱讀標準或正式API文檔的人來說,這種事情往往有點令人驚訝。措辭的選擇是故意的,「可能」一詞通常表示允許發生的事情。 「will」(或者不太常用的「shall」)一詞用於表示擔保。

另外,pthread_mutex_init實際上會返回錯誤代碼,如果有的話,它不會設置errno。從您引用的手冊頁:

如果成功,pthread_mutex_destroy()和pthread_mutex_init()函數將返回零;否則,將返回一個錯誤號以指示錯誤。