[問題] stl container with multi thread

看板C_and_CPP (C/C++)作者時間15年前 (2010/08/10 20:38), 編輯推噓0(008)
留言8則, 3人參與, 最新討論串1/1
剛才正在查有關 stl container 跟 multi thread間的關系 如果有一個std::map<> 會在2個thread中被用到 那以下的解決方式 是否最合適? class ThreadSafeMap{ public: void aquire(){ lock.lock(); } void release(){ lock.release(); } map& getMap(){ return mymap;} protected: boost::mutex lock; map<> mymap; } 在任何thread中 不論要取得 修改 或 做iterator 都必須先呼叫 ThreadSafeMap tsm; //先進行上鎖動作 tsm.aquire(); //取得map map<>& mymap = tsm.getMap(); //然後 我們才能做這類的讀寫動作 mymap["123"] = "456"; map<>::const_iterator itr; for(itr = map.begin();itr!=map.end();itr++) cout << itr->second; //解除鎖定 tsm.release(); 在不考慮效能(1 writer - many reader)的狀況下, 這解法是否可行? 或者有更好用的解法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.70.172.147

08/10 21:00, , 1F
你複製一個出來, 隨便你用啊, 不用鎖
08/10 21:00, 1F

08/10 21:01, , 2F
還是 map<> mymap = tsm.getMap(); 這行筆誤?
08/10 21:01, 2F

08/10 21:04, , 3F
哦 對對 是筆誤 少打了 &
08/10 21:04, 3F
※ 編輯: neigence 來自: 219.70.172.147 (08/10 21:05)

08/10 21:11, , 4F
可以試試 shared_mutex
08/10 21:11, 4F

08/10 21:13, , 5F
都是讀寫的話, 除非你有 precondition 要確保, 不然可
08/10 21:13, 5F

08/10 21:14, , 6F
寫的時候再鎖, 讀的話如果要做io也是要再鎖
08/10 21:14, 6F

08/11 01:06, , 7F
好像將lock及unlock的動作寫在讀寫操作內比較合理些
08/11 01:06, 7F

08/11 01:08, , 8F
也可以省一道getMap的手續,不過要implement的操作也比較多
08/11 01:08, 8F
文章代碼(AID): #1COKW_rm (C_and_CPP)
文章代碼(AID): #1COKW_rm (C_and_CPP)