Окружающая среда: Windows 7.0, C ++, многопоточность
Я создал новый рабочий поток для получения данных на сокете и добавления их в статический multimap
пример.
фрагмент кода:
//remember mymultimap is static data type
static std::multimap<string,string> mymultimap;
EnterCriticalSection(&m_criticalsection);
mymultimap.insert ( "aaa", "bbb") );
LeaveCriticalSection(&m_criticalsection);
В то же время мой основной поток читает ту же статическую мультикарту:
привязка кода:
EnterCriticalSection(&m_criticalsection);
std::multimap<string,string>::iterator it = mymultimap.begin();
for( ; it != mymultimap.end(); it++)
{
std::string firstName = (*it).first;
std::string secondName = (*it).second;
}
LeaveCriticalSection(&m_criticalsection);
Поскольку основной и рабочий потоки постоянно читают и пишут, это мешает работе моего приложения.
Также пример multimap
содержит огромные данные (более 10000 записей).
Как я могу сделать блокировку потока за минимальное время в мультикарте?
EnterCriticalSection(&m_criticalsection);
///minimal lock time for Map ???
LeaveCriticalSection(&m_criticalsection);
Пожалуйста, помогите мне улучшить производительность моего приложения.
Ваш вопрос оставляет слишком много места для обсуждения: мы не знаем, как на самом деле используются значения, хранящиеся в вашей мультикарте.
Если:
тогда вы в значительной степени застряли в том, как мы можем оптимизировать использование этой структуры.
С другой стороны, если вы можете как-то ослабить одно из этих требований, то у вас могут быть возможности немного оптимизировать вещи, например, используя очередь сообщений вместо карты непосредственно для связи между обоими потоками.
Очереди сообщений являются стандартным способом реализации эффективной связи между потоками, и для индивидуальной настройки существуют даже решения без блокировки.
Обновитьдумать об этом, разделять структуру такого типа между потоками — не очень хорошая идея, как бы вы ее ни использовали. Лучше перегруппировать все обращения к мультикарте в одном потоке, и, таким образом, элементы, сгенерированные другими потоками, будут переданы потоку, управляющему им через очередь. Это полностью отделяет работу по генерированию предметов от их хранения и использования. В вашем случае поток производителя будет тратить меньше времени на хранение данных, что оставляет больше времени для обработки потока сокетов.
Итак, для этого решения вам нужно queue<std::pair<key,value> >
, сказать std::queue
для обработки обоим потокам при их инициализации или, в качестве альтернативы, статическому экземпляру типа multimap
один. Затем просто замените multimap::insert
в первой теме queue::push_back
из make_pair(key, value)
и симметрично в потоке потребителя fisrt имеют pop_front
Из всех ожидающих пар в очереди, одновременно вставляя их в карту, затем осуществите обработку вашей карты, какой бы она ни была.
Замечания:
Имейте в виду, что если вы используете мультикарту, вы можете получить несколько значений для одного и того же ключа: вызов find
вернет итератор, и вам, возможно, придется проверить следующие записи мультикарты, чтобы убедиться, что вы получаете все значения с одинаковыми ключами.
Других решений пока нет …