Linux 多線程可重入函數(shù)
Reentrant和Thread-safe
在單線程程序中,整個程序都是順序執(zhí)行的,一個函數(shù)在同一時刻只能被一個函數(shù)調(diào)用,但在多線程中,由于并發(fā)性,一個函數(shù)可能同時被多個函數(shù)調(diào)用,此時這個函數(shù)就成了臨界資源,很容易造成調(diào)用函數(shù)處理結(jié)果的相互影響,如果一個函數(shù)在多線程并發(fā)的環(huán)境中每次被調(diào)用產(chǎn)生的結(jié)果是不確定的,我們就說這個函數(shù)是"不可重入的"/"線程不安全"的。為了解決這個問題,POSIX多線程庫提出了一種機(jī)制,用來解決多線程環(huán)境中的線程數(shù)據(jù)私有化問題,這套機(jī)制的主要思想是利用同步和互斥維護(hù)一個同名不同值的表,這個表會維護(hù)每個線程自己的資源地址,表面上是同一個變量,實質(zhì)上這個變量在不同的線程中的地址是不一樣,這樣就保證了每個線程其實都在使用自己的資源,實現(xiàn)了"thread-safe"。
其實,隨著多線程程序的逐漸流行,除了這種利用系統(tǒng)機(jī)制保護(hù)線程私有數(shù)據(jù)的方法,還有一部分人重新編寫了一些多線程庫函數(shù),這些函數(shù)的主要特點就是實現(xiàn)了算法和數(shù)據(jù)的分離,函數(shù)內(nèi)部只負(fù)責(zé)實現(xiàn)算法,需要的數(shù)據(jù)由線程傳入,這樣就保證了函數(shù)的多線程安全,eg
char *asctime(const struct tm *tm); char *asctime_r(const struct tm *tm, char *buf); //這個就是asctime的thread-safe版,有_r后綴
但由于接口不同,完全重寫的函數(shù)推廣尚需時日。
當(dāng)下用的更多的是使用_REENTRANT來在原來的函數(shù)的基礎(chǔ)上改造,如果編譯的時候定義了這個宏,相關(guān)的庫函數(shù)就會被編譯成"thread-safe"的版本。
模型
如果要查看這些函數(shù)的man手冊,可以安裝相關(guān)的man手冊
pthread_key_t key //創(chuàng)建用于保護(hù)線程私有資源的key pthread_once_t once_key
延伸閱讀
- ssh框架
2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖
2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe
2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】
2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞
2017-07-26
- 從棧不平衡問題 理解 calling convention
2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明
2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解
2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析
2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二)
2017-07-26
學(xué)習(xí)是年輕人改變自己的最好方式