У меня есть std :: map, которая используется несколькими потоками для хранения данных. Карта объявляется так:Указатель на значение в 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, но может ли кто-нибудь сказать мне, подходит ли один из этих методов или есть способы сделать его более стабильным.
Благодаря
Получение указателя на элемент вызова может работать сейчас, но поскольку вы помещаете фактические экземпляры в объект карты, std :: map может решить внутренне скопировать его в другое место. Это означало бы, что указатель уже недействителен и потенциально может указывать на освобожденную память. На данный момент я не могу придумать решение, но я просто хотел сообщить вам, что это не сработает. – arke