以降の操作全体がアトミックに行われる。a.g();}これを外部ロックと呼ぶことにする。外部ロックの作成を忘れた場合は全く同期されないアクセスが行われてしまう。それはよろしくないので、内部ロックを併用する。a.g();}基本は内部ロックを使い、複数の操作を行う際は外部ロックを使ってブロック全体をアトミックにする。同一スレッドから2重にロックする場合があるため、recursive_mutexを使う必要がある。外部ロックと内部ロックを組み合わせる:クラスをLockableにするboost::(basic|timed|shared)_lockable_adapterを使うと楽。a.g();}単に見た目の違いだが、割と直感的で良いかもしれない。いつも思うが、adapter/adaptorはBoost内で統一してほしい。};};ロックのlvalueをexternally_locked::getに渡さないと内部のオブジェクトがとれないため、必然的にローカル変数lockを書くことになり、同期ブロックが導入される。インターフェースが自然に実装を規定している。flatlineの日記とか。ポインタを介さないとアクセスできないようにする。下のコードで、sync<T>はTのオブジェクトを保有し、sync<T>::lock()でロックされたTへのポインタを返す。これを禁止して、ローカル変数pの作成をやんわりと強制することもできる。a.lock()->f();}追記:Boostにある(入る予定)らしい。Krile2さらに推し進めて、read-lock/write-lockを内包するポインタを用意し、read-lockポインタからはconstメンバ関数しか呼び出せないようにする、とかできる。その道の人が書くとこうなるらしい。おまけBoost.Threadはロックのファクトリ関数を提供する。boost::make_unique_lock(mutex);make_lock_guardもあるが、lock_guardはムーブできないので参照で受けるとかする。yohhoyの日記タグ付きバリアント型があってもいいじゃない。要素の意味が明確になる。複数の同じ型の要素に別の意味を与えることができる。いう利点が得られます。ラップしてタグ付きバリアント型としてみました。