MFC對(duì)象不要跨線程使用,因?yàn)镸FC不是線程安全的。比如CWnd對(duì)象不要跨線程使用,可以用窗口句柄(HWND)代替。CSocket/CAsyncSocket對(duì)象不要跨線程使用,用SOCKET句柄代替.那么到底什么是線程安全呢?什么時(shí)候需要考慮?如果程序涉及到多線程的話,就應(yīng)該考慮線程安全問(wèn)題。比如說(shuō)設(shè)計(jì)的接口,將來(lái)需要在多線程環(huán)境中使用,或者需要跨線程使用某個(gè)對(duì)象時(shí),這個(gè)就必須考慮了。關(guān)于線程安全也沒(méi)什么權(quán)威定義。在這里我只說(shuō)說(shuō)我的理解:所提供的接口對(duì)于線程來(lái)說(shuō)是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說(shuō)我們不用考慮同步的問(wèn)題。
一般而言“線程安全”由多線程對(duì)共享資源的訪問(wèn)引起。如果調(diào)用某個(gè)接口時(shí)需要我們自己采取同步措施來(lái)保護(hù)該接口訪問(wèn)的共享資源,則這樣的接口不是線程安全的.MFC和STL都不是線程安全的. 怎樣才能設(shè)計(jì)出線程安全的類(lèi)或者接口呢?如果接口中訪問(wèn)的數(shù)據(jù)都屬于私有數(shù)據(jù),那么這樣的接口是線程安全的.或者幾個(gè)接口對(duì)共享數(shù)據(jù)都是只讀操作,那么這樣的接口也是線程安全的.如果多個(gè)接口之間有共享數(shù)據(jù),而且有讀有寫(xiě)的話,如果設(shè)計(jì)者自己采取了同步措施,調(diào)用者不需要考慮數(shù)據(jù)同步問(wèn)題,則這樣的接口是線程安全的,否則不是線程安全的