摘自:
http://liuaigui.blog.sohu.com/86494742.html線程安全的(Thread-Safe):如果一個函數(shù)在同一時刻可以被多個線程安全地調(diào)用,就稱該函數(shù)是線程安全的。線程安全函數(shù)解決多個線程調(diào)用函數(shù)時訪問共享資源的沖突問題。
可重入(Reentrant):函數(shù)可以由多于一個線程并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯誤。可重入函數(shù)可以在任意時刻被中斷,稍后再繼續(xù)運行,不會丟失數(shù)據(jù)??芍厝胄越鉀Q函數(shù)運行結(jié)果的確定性和可重復(fù)性??芍厝牒瘮?shù)編寫規(guī)范為:
1、不在函數(shù)內(nèi)部使用靜態(tài)或全局?jǐn)?shù)據(jù)
2、不返回靜態(tài)或全局?jǐn)?shù)據(jù),所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。
3、使用本地數(shù)據(jù),或者通過制作全局?jǐn)?shù)據(jù)的本地拷貝來保護(hù)全局?jǐn)?shù)據(jù)。
4、如果必須訪問全局變量,利用互斥機制來保護(hù)全局變量。
5、不調(diào)用不可重入函數(shù)。
兩者之間的關(guān)系:
1、一個函數(shù)對于多個線程是可重入的,則這個函數(shù)是線程安全的。
2、一個函數(shù)是線程安全的,但并不一定是可重入的。
3、可重入性要強于線程安全性。
比如:strtok函數(shù)是既不可重入的,也不是線程安全的。加鎖的strtok不是可重入的,但線程安全。而strtok_r既是可重入的,也是線程安全的
之所以會去查這個問題,是在考試中遇到過考strtok這個問題是否可用于多線程。自己從使用的角度上感覺不安全,但是究其原因卻不是很明白。查了一下,居然涉及到函數(shù)的線程安全。
在另一篇博文中,是這樣解釋的:
strtok不是一個線程安全的函數(shù)。因為根據(jù)其定義,它必須使用內(nèi)部靜態(tài)變量來記錄字符串中下一個需要解析的標(biāo)記的當(dāng)前位置。但是,由于指示這個位置的變量只有一個,那么,在同一個程序中出現(xiàn)多個解析不同字符串的strtok調(diào)用時,各自的字符串的解析就會互相干擾。(摘自:
http://hi.baidu.com/pigfanfan/blog/item/72816c958d63e743d1135ebf.html)
怎么避免呢?
我們可以利用另一個函數(shù):strtok_r,這個是一個線程安全的函數(shù)——strtok_r,以此來代替strtok。
posted on 2009-10-22 17:33
Sandy 閱讀(1597)
評論(0) 編輯 收藏 引用 所屬分類:
面試總結(jié)