1. 儘量不要使用線程外部傳入的內存指針
如果線程運行期內使用了一個外部傳入的內存指針,這是十分危險的。因爲外部內存指針何時釋放,你是無法知道的。如果外部內存指針在線程運行期內提前釋放了,
那麼將特別容易造成程序崩潰。
這一點說起來十分簡單,可是到了程序裏面,大量的程序代碼、邏輯結構交織在一起,再想看清楚線程間使用內存的關係,就比較困難了。
爲了理清線程使用的內存是否爲外部傳入可以從兩個方面入手:
A. 線程的傳入參數, 因爲線程傳入參數一般只是一個指針。那麼就要分析清楚這個傳入指針所指的內存是誰申請的,在什麼時候釋放。
B. 避免全局函數的調用,在線程不要再調用全局函數,全局函數如何分配內存完全不可知。
2. 如果必須使用外部內存與其它線程進行通信,那麼要確保外部內存的生命週期 大於 線程運行期
當兩個線程通信時,如果採用了生產者-消費者這樣的模型,一般來說大家不容易忘記這一點,因爲一般會先創建該模型,然後在運行線程,最後在線程都結束後再釋放。
可如果沒有采用這樣的多線程模型,比如直接在全局開闢了一塊內存,讓多線程共享,這就比較麻煩了,經常容易出現因內存訪問錯誤的問題。
爲此,建議對於多線程需要共享的內存,進行統一管理。創建一個對象管理器,來管理需要共享的內存。然後控制該對象管理器的生命期一定要 大於 共享該內存的多個線程。
寫在後面:
需要閱讀一些服務器程序,特別是它是如何處理在多線程之間共享內存的,特別是與業務邏輯進行結合的時候。