電子書籍の厳選無料作品が豊富!

ひとつのコンテナを複数のスレッドで共有する場合について教えていただきたいです。

例:
--------------------------------------------------
map Aを更新するスレッドthr1、
map Aのおおよその状況をファイルにダンプするスレッドthr2、
というコードを記述したいです。

thr2について、「おおよそ」というのは、thr1がAをどんどん更新(insert, erase)するので、
イテレータ取得した時刻やイテレータを++したタイミングに影響を受けて、Aの特定の瞬間を丸々きれいにダンプできなくてもイイや別に、という意味です。
(丸々ならよりよいのですが。)
--------------------------------------------------

クラスにmapをメンバとして持たせ、同様に更新・ダンプのメソッドも持たせ、
このメソッドを別々のスレッドとして起動させて、参照はイテレータを利用すれば実現できるかなぁ、と思っていたのですけど、調べると「だめかも」しれない、と思えてきました。
先ずはこの点、どうなのでしょうか?★

mapを更新すると、その瞬間、イテレータを再度取得しなおさないと、未定義の動作かアクセス違反的な難しいことになりそうです。

今回の例を実現するには、いちいちmapをロックしないとならないでしょうか?★

A 回答 (1件)

> 今回の例を実現するには、いちいちmapをロックしないとならないでしょうか?★



lockだけで十分だろうか?
たとえば thr2が begin(),end() を手に入れた直後にthr1がclear()したら、
thr2が入手したiteratorはつかえなくなってますよね。
    • good
    • 0
この回答へのお礼

epistemeさん、いつもありがとうございます。

mapの更新アクセスの際はロックしてからの利用とします。
参照するスレッドはロックしてから複製したmapに対して参照をかけることにします。

お礼日時:2011/06/15 22:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!