2016-11-15 12 views
0

関数にアクセスしようとするスレッド(マップ)があるので、関数内でstd :: mapと2つのboost :: multimapsの操作をロックする必要があります。何より良いstd :: lock_guard <std::mutex>ロック(std :: mutex mutex_var);またはstd :: mutex mutex_var.lock();

"std :: mutex mutex_var"を使用して、それらを操作する関数内の変数を保護することを計画しています。だから私は "std :: mutex mutex_var"変数を持っています。私は関数の最初に "mutex_var.lock()"を使用し、関数の最後に "mutex_var.unlock()"を使用するのは混乱しています。単に関数の先頭でstd :: lock_guardを使用しますか?

明確にするために、すべての機能はミューテックスに物事を追加しています。私は理解しています/私たちが地図を照会しようとしているすべての場所を守る必要はない(読み込み操作だけなので)。

もっと良い選択肢を教えてください。また、私の読書の考え方が保護を必要としないかどうかを明確にしてください。シンプルなミューテックスで

TIA

-R

+0

一度に1つの質問をする必要があります。 – Slava

+3

ミューテックスをロックしている間に例外がスローされるとどうなりますか? –

+0

mutex.lock()に問題があるかもしれませんが、スタックフレームが消えてlock_guardがスコープを失ってロックが解除されるため、std :: lock_guard(mutex_var)がうまくいくと思っていました。私が間違っていれば私を修正してください。 – codeworks

答えて

0
  • すべてのスレッドがスレッドを読んでいる場合、あなたはリソースをロックする必要はありません。しかし、スレッドの中に頼りに書き込んでいるスレッドが1つ以上ある場合は、すべてのスレッドから読み込みスレッドまでロックする必要があります。
  • 書き込みスレッドがなく、リソースが1つの書き込みスレッドであるときにリソースをロックすると、リソースのロックを回避する方法があります。あなたはより複雑なロック機構を使用する必要があります。あなたはopenforreadとopenforwriteロジックについて読むべきです。
関連する問題