データを格納するために複数のスレッドで使用されるstd :: mapがあります。マップはこのように宣言された各スレッドからstd :: mapの値へのポインタ
std::map<int, Call> calls;
、Iは、相互排他ロックを取得し、そのスレッドに属しているオブジェクトへのポインタ又は参照を取得し、ミューテックスのロックを解除しなければなりません。各オブジェクトは1つのスレッドだけで使用されるため、そのあとでオブジェクトを変更できます。スレッドが消えるとすぐに、マップ内の対応するペアも削除されます。
これを実装する最良の方法を知りたいと思います。私は2つの方法を考えていた:私はこの1つを知っている
1)
は傍若無人クレイジーになりますが、それでもstd::map<int, Call> calls;
...
{
mutex.lock();
Call* callptr = &calls[id];
mutex.unlock();
// use callptr
}
または2)私はこの1つはより賢明に見えると思います
std::map<int, std::auto_ptr<Call> > calls;
...
{
mutex.lock();
std::auto_ptr<Call> callptr = map[id];
mutex.unlock();
// use callptr
mutex.lock();
map[id] = callptr;
mutex.unlock();
}
スレッド実際には別のDLLで作成され、私はそのコードを持っていません。私が今書いているこのDLLは、そのDLLによってインポートされて使用されます。したがって、std :: mapのみで実装する必要がありますが、これらのメソッドのいずれかがOKか、安定させる方法があるかどうかは誰にでも分かります。
おかげ
Callアイテムへのポインタを取得することはできますが、実際のインスタンスをマップオブジェクトに入れているので、std :: mapは内部的に他の場所にコピーすることを決定することがあります。つまり、ポインタはもはや有効ではなく、解放されたメモリを指し示す可能性があります。現時点では解決策は考えられませんが、これはうまくいかないことをお知らせしたいと思います。 – arke