У меня есть std :: map, которая используется несколькими потоками для хранения данных. Карта объявлена так:
std::map<int, Call> calls;
Из каждого потока мне нужно получить блокировку мьютекса, получить указатель или ссылку на объект, принадлежащий этому потоку, а затем снять блокировку мьютекса. После этого я могу изменить объект, потому что каждый объект используется только одним потоком. Как только поток умирает, соответствующая пара на карте также будет удалена.
Я хотел бы знать, как лучше всего это реализовать. Я думал о двух путях:
1) Я знаю, что это может выглядеть безумно безумно, но все же
std::map<int, Call> calls;
...
{
mutex.lock();
Call* callptr = &calls[id];
mutex.unlock();
// use callptr
}
или 2) Я думаю, что этот выглядит более разумным
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, но кто-нибудь может сказать мне, подходит ли один из этих методов или есть способы сделать его более стабильным.
Спасибо