簡體   English   中英

使用PTHREAD_MUTEX_INITIALIZER宏時檢查錯誤

[英]Checking for error when using the PTHREAD_MUTEX_INITIALIZER macro

通常,有人告訴我應該測試任何系統調用(或類似方法)返回時是否有錯誤。

使用以下方法初始化pthread互斥鎖時:

pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER; 

我們不檢查操作是否成功。

但是使用此宏而不是動態初始化似乎是一種常見的做法。

在這種情況下,是否有充分的理由不需要進行錯誤檢查?

不需要進行錯誤檢查的原因是因為靜態初始化不會失敗。 在最常見的實現中, PTHREAD_MUTEX_INITIALIZER類似於0{} (取決於pthread_mutex_t的定義方式),以確保零初始化,並且使用pthread_mutex_t的各種系統調用都旨在處理零初始化的pthread_mutex_t好像已將其初始化為所有默認值一樣,這是因為類型是通過這種方式顯式設計的,或者因為例程使用了惰性初始化。

(請注意, PTHREAD_MUTEX_INITIALIZER不能與__special_mutex_initializer() ,因為它可用於初始化C中的文件范圍靜態變量,並且C需要使用編譯時常數表達式來初始化靜態變量。)

編輯:

有關更多信息,您可能需要閱讀http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_init.html的基本原理部分。 這描述了幾種不同的可能實現方式,以及其中涉及的一些權衡。

IBM

注意:使用PTHREAD_MUTEX_INITIALIZER進行互斥鎖初始化不會立即初始化互斥鎖。 而是在首次使用時,pthread_mutex_lock()或pthread_mutex_trylock()函數會分支到慢速路徑中,並導致互斥量的初始化。 因為互斥鎖不僅僅是一個簡單的內存對象,並且需要系統分配一些資源,所以嘗試在使用PTHREAD_MUTEX_INITIALER靜態初始化但尚未鎖定的互斥鎖上調用pthread_mutex_destroy()或pthread_mutex_unlock()會導致EINVAL錯誤。

如果使用PTHREAD_MUTEX_INITIALIZER ,請稍后進行錯誤檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM