作者neigence ()
站內C_and_CPP
標題[問題] stl container with multi thread
時間Tue Aug 10 20:38:20 2010
剛才正在查有關 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
→ loveme00835:你複製一個出來, 隨便你用啊, 不用鎖 08/10 21:00
→ loveme00835:還是 map<> mymap = tsm.getMap(); 這行筆誤? 08/10 21:01
→ neigence:哦 對對 是筆誤 少打了 & 08/10 21:04
※ 編輯: neigence 來自: 219.70.172.147 (08/10 21:05)
→ loveme00835:可以試試 shared_mutex 08/10 21:11
→ loveme00835:都是讀寫的話, 除非你有 precondition 要確保, 不然可 08/10 21:13
→ loveme00835:寫的時候再鎖, 讀的話如果要做io也是要再鎖 08/10 21:14
→ dk3208:好像將lock及unlock的動作寫在讀寫操作內比較合理些 08/11 01:06
→ dk3208:也可以省一道getMap的手續,不過要implement的操作也比較多 08/11 01:08