我有一個回圈鏈表,每個子執行緒只需要讀鏈表結點里的資料,但主執行緒有時會對回圈鏈表里的結點進行改寫。
我的設計思路是每次主執行緒改寫鏈表結點都需要進入臨界區,改寫完成離開。請教大佬們子執行緒讀鏈表結點的資料可以不加臨界區嗎?如果需要加臨界區,那么給每個子執行緒各分配一個回圈鏈表是否效率會更高些?(好像需要用到TLS,那么主執行緒如何訪問每個執行緒TLS里的回圈鏈表呢)
uj5u.com熱心網友回復:
加鎖比較安全,但是效率不高,可以了解一下讀寫鎖;給每個子執行緒各分配一個回圈鏈表,也涉及到資料同步問題,效率應該更差
uj5u.com熱心網友回復:
修改資料的主執行緒只有一個吧?如果子執行緒不加那么主執行緒也沒必要加,因為修改資料的主執行緒只有一個,沒人跟它搶,就沒有沖突。你的回圈鏈表的資料是公用的嗎?如果是公用的,你給每個子執行緒都分配一個回圈鏈表,那么主執行緒每次需要更新所有的子執行緒鏈表,每次都要跟所有的子執行緒競爭。一個鏈表的話是主執行緒、所有子執行緒之間競爭;多個鏈表是主執行緒和每一個子執行緒之間競爭,感覺效率高不到哪去。
uj5u.com熱心網友回復:
好的謝謝指點!
uj5u.com熱心網友回復:
好的謝謝指點!uj5u.com熱心網友回復:
再確認一下! 我的子執行緒是while(1)持續讀取回圈鏈表里的資料 主執行緒可能會對回圈鏈表進行修改 不過只有主執行緒修改 不用加臨界區嗎
uj5u.com熱心網友回復:
只有一個執行緒修改共享資源不需要加。其他執行緒只是讀,不影響uj5u.com熱心網友回復:
讀寫鎖是正解
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/275972.html
標籤:進程/線程/DLL
上一篇:MFC黑屏
