C# 多執行緒資源克隆解決方式及其應用
背景:多執行緒中的共享資源處理常用的方法是加鎖,但是加鎖是的任務處理由並行處理程式設計了序列處理大大降低了多執行緒的效率,這裡介紹另一種處理多執行緒共享資源的處理方式克隆,介紹在C#中克隆解決多執行緒問題的示例和其他開源框架中使用這種思想實現的一些功能,歡迎大家留言交流。
程式碼:這是一段很簡單的多執行緒迴圈取值的程式碼,雖然簡單但是很快就出錯了,索引超出範圍
原理:這就是同一個公共變數i共享出現的問題,解決這個問題通常的做法是加鎖或其他處理,一次只處理一條記錄,另一個方法就是變數克隆,這裡的i公共變數是值型別,只需要簡單的賦值操作就能達到可能的效果,所以修改成如下圖就正常了:
應用:
應用一:資料庫Oracle等併發
Oracle資料庫中處理資料併發時就有一種處理方式就是使用的資料拷貝。當有條資料需要修改時常用的模式是鎖住這條記錄,這樣不利於資料庫的併發操作,所有對這條資料的後續操作都得等修改處理完後才能處理,這時做一個最壞的打算如果修改這條記錄的人開啟了修改記錄但是一直不提交,資料庫策略裡面又沒有設定超時,那麼後面的所有這條資料的處理都將癱瘓,即便有超時策略也要等待很長時間才能響應。如果採用資料拷貝的模式,就是不給資料庫記錄加鎖,每次都只讀取一個記錄拷貝進行修改,修改完成以後再寫回資料庫,這樣資料庫就沒有鎖記錄的情況,或者說只有讀取、寫入的那一剎那會鎖記錄,這樣資料庫的併發就上去了,這裡要注意的是為了避免多個寫入的可能,一般會加上時間戳配合使用,只有時間大於當前提交時間的修改才能生效,這樣就避免了資料修改的衝突
應用二:大資料Hadoop中的記錄追加
Hadoop、Kafka等開源框架中的資料追加大量運用了這種思想,如下是Hadoop追加記錄的一個示例圖:SNN(Secondary Name Node Hadoop大資料檔案分為檔案索引NameNode和檔案塊DataNode,其中NameNode又分為Primary NameNode和Secondary NameNode即主和從)
應用3......N:類似應用還有很多,這裡就不一一列舉了