多執行緒共享資料的更新的解決辦法

2021-06-19 17:03:32 字數 689 閱讀 1696

業務場景是這樣的,有多個應用執行緒需要使用業務資料,而業務資料需要定期同步或者準實時同步過來(秒級別),通常這種情況首先想到的就是通過加鎖的方式,

(一)乙個執行緒負責從資料庫,或者檔案,或者網路中載入資料,加上寫鎖,這樣避免不了鎖競爭,尤其是在寫資料的時候,會造成驚群效應,即使是在沒有些的情況,讀鎖還是有一定的開銷的。但是這種方式好處是實現起來簡單,記憶體消耗比較小。

(二)乙個執行緒負責取資料,每次new 乙個新的buffer,接收全量或者增量資料,用乙個臨時指標指向之前正在使用的資料,新的buffer載入好後,將使用資料的全域性指標指向新的buffer,(在切換成新指標的時候加上寫鎖,其他的地方加上讀鎖)再delete 臨時指標(釋放老的資料),這個方法在我之前的乙個專案中執行很長時間重來沒有出現過問題,這樣實現了共享資料只在切換的時候加上寫鎖,其他地方只有讀鎖,顯著的減少了鎖競爭,和鎖粒度。實現了資料更新的無縫切換。此方案在資料一致性要求非常嚴格的場景並不適應,只是適應不經常變更的資料,而且資料的變更對服務的響應允許一定的延時,非實時一致性。

map*t = g_using;

map*new_map = new map(int, int);

載入資料到new_map;

pthread_rwlock_wrlock();

g_uing = new_map;

pthread_rwlock_unlock();

delete t;

TCP 多執行緒 同時傳送大量資料 解決辦法

向大家分享一下.呵呵 伺服器向多個終端傳輸大量資料。並且同時向他們傳送,採用安全的tcp方式。我採用的辦法是 首先向多個終端 建立socket陣列,建立多個執行緒 建立多個執行緒的目的不是要 每個執行緒向不同的終端傳送,而是每個執行緒傳送不同的資料,比如乙個1g的資料,我執行緒1取出他的100m內容...

php的curl多執行緒採集網頁的解決辦法

最近在抓取的時候發現單執行緒的curl採集多個網頁的時候速度特別慢,尤其是數量超過100的時候,都要幾分鐘才能獲取完畢。於是在網上找了curl多執行緒的採集方法,網上流傳的 都是不完善的,最近經過多次除錯,最終解決了,多執行緒採集獲取上百個也沒只花費10多秒。輸入引數為url陣列,返回結果為對應的網...

java中多執行緒的安全問題以及解決辦法

publicstaticvoidmain string args publicstaticvoidshow publicclas mentsrunnable privateint ticket 100 publicvoidrun catch interruptedexception e system...