看板 C_and_CPP 關於我們 聯絡資訊
剛才正在查有關 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