Linux下的strerror是否執行緒安全?
下列是glibc-2.14中的原始碼:
點選(此處)摺疊或開啟
-
char *
- strerror (errnum)
- int errnum;
- {
- char *ret = __strerror_r (errnum, NULL, 0);
- int saved_errno;
- if (__builtin_expect (ret != NULL, 1))
- return ret;
- saved_errno = errno;
- if (buf == NULL)
- buf = malloc (1024);
- __set_errno (saved_errno);
- if (buf == NULL)
- return _(“Unknown error”);
- return __strerror_r (errnum, buf, 1024);
- }
man strerror即可看到相關說明,strerror_r是執行緒安全的,但不帶_r的strerror是非執行緒安全的。
不過大部分時候strerror是安全的,因為大多數情況: if (__builtin_expect (ret != NULL, 1)) return ret; 這個地方能return出來。大多數憑空return非const字串的都不是執行緒安全的,而strerror大部分系統認識的errno都是返回const字串,所以大部分時候都是安全的。
遇到不安全的結果是返回錯亂的字串,但不會coredump,原因是buf的記憶體總是有效的。使用者如果給一個不存在的errno,會返回 “Error %d”這種東西,就非安全。
所以如果確認給的都是合法的errno,可以認為是安全的。或者乾脆 #define strerror(x) strerror_r((x),0,0),這個#define要加-D_GNU_SOURCE編譯。
如果只是用當前的errno,直接用%m,但%m要直接使用系統的Xprintf,不能做二次封裝,否則中途一下庫函式會改變當前errno。如果封裝裡面用了malloc(),localtime這一類的,會改變當前errno值,使用Xprintf時值就不對了,如果重封裝要先儲存再恢復errno。
可以在多執行緒中盡情使用strerror,但最好同時記錄errno,萬一亂字串,還可通過errno取得正確的。
相關文章
- linux檢視是否開啟超執行緒Linux執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 執行緒安全執行緒
- 多執行緒系列之 執行緒安全執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 執行緒數,512是否合理?執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- Java下如何保證多執行緒安全Java執行緒
- Java執行緒安全Java執行緒
- 執行緒安全(二)執行緒
- Linux下程式與執行緒概念淺析Linux執行緒
- linux-執行緒Linux執行緒
- 什麼時候執行緒不安全?怎樣做到執行緒安全?怎麼擴充套件執行緒安全的類?執行緒套件
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 程式執行緒篇——執行緒切換(下)執行緒
- 靜態變數在多執行緒環境下的初始化是執行緒安全的嗎?變數執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- iOS開發基礎——執行緒安全(執行緒鎖)iOS執行緒
- ArrayList 的執行緒安全問題執行緒
- 保障執行緒安全的設計執行緒
- 容器不是執行緒安全執行緒
- ConcurrentHashMap執行緒安全嗎?HashMap執行緒
- Concurrency(四:執行緒安全)執行緒
- 執行緒安全性執行緒
- 多執行緒下的list執行緒
- Linux 程序和執行緒Linux執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 如何看待Spring下單例模式與執行緒安全的矛盾Spring單例模式執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- day20_多執行緒入門丶執行緒安全執行緒