多執行緒讀操作的異常安全性

2021-10-01 05:41:23 字數 629 閱讀 9560

最近在寫乙個專案,程式偶現乙個「double free」 問題,經過排查發現在實際運**況中會有多個執行緒呼叫乙個loadstring操作,而原本loadstring只是乙個讀操作,而多執行緒共同讀同乙個資源資訊按理說應該是不會有同步問題出現的,但是通過gdb除錯發現程式的崩潰處在switchlanguage的乙個賦值操作。

然後我走進switchlanguage中發現那個崩潰的賦值操作發生在兩個map進行賦值的時候。

而容器在進行賦值操作時,會先清理掉原先的記憶體然後再對新的記憶體進行賦值,而stl中的容器大多不是執行緒安全的。所以很有可能內部的銷毀操作執行多次,這也就是為什麼會發生double free的原因了。而且多執行緒的運**況無法保證每次都重現、程式都崩潰。所以自然是個偶現的bug。

因此解決辦法就是在外部執行switchlanguage操作時加鎖,以防止多個程序同時進入。

總結: 由於之前的多執行緒程式設計經驗較為貧乏,想當然地認為讀操作多執行緒訪問肯定是沒有問題的,事實證明多執行緒的水還很深。

執行緒安全性

定義 當多個執行緒訪問某個類時,不管執行環境採用何種呼叫方式或者這些執行緒如何交替執行,並且在主調 中不需要任何額外的同步或者協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。主要表現三個方面 atomic cas unsafe.compareandswapint atomiclong...

執行緒安全性

執行緒安全性 當多個執行緒訪問某個類時,這個類始終都能表現出正確的行為,那麼稱這個類是執行緒安全的。執行緒不安全產生的問題 競態條件 由於不恰當的執行時序而出現不正確的結果。大多數競態條件的本質是基於一種可能失效的觀察結果來做出判斷或者執行某個計算。常見先檢查後執行,延遲初始化 單例模式 讀取 修改...

java多執行緒之執行緒的安全性 一

物件的狀態 物件的狀態是指儲存在狀態變數 例項或靜態域 中的資料。物件的狀態還可能包括其他依賴物件的域。例如,hashmap的狀態不僅儲存在物件本身,還儲存在map.entry物件中。多執行緒安全的概念 當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調...