Многопоточность с мультикартой

Окружающая среда: 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);

Пожалуйста, помогите мне улучшить производительность моего приложения.

1

Решение

Ваш вопрос оставляет слишком много места для обсуждения: мы не знаем, как на самом деле используются значения, хранящиеся в вашей мультикарте.

Если:

  • порядок в этой структуре данных важен,
  • вам нужно сохранить значения в мультикарте даже после того, как они были прочитаны,
  • вам нужно просматривать все записи каждый раз, когда вы читаете,

тогда вы в значительной степени застряли в том, как мы можем оптимизировать использование этой структуры.

С другой стороны, если вы можете как-то ослабить одно из этих требований, то у вас могут быть возможности немного оптимизировать вещи, например, используя очередь сообщений вместо карты непосредственно для связи между обоими потоками.

Очереди сообщений являются стандартным способом реализации эффективной связи между потоками, и для индивидуальной настройки существуют даже решения без блокировки.

Обновитьдумать об этом, разделять структуру такого типа между потоками — не очень хорошая идея, как бы вы ее ни использовали. Лучше перегруппировать все обращения к мультикарте в одном потоке, и, таким образом, элементы, сгенерированные другими потоками, будут переданы потоку, управляющему им через очередь. Это полностью отделяет работу по генерированию предметов от их хранения и использования. В вашем случае поток производителя будет тратить меньше времени на хранение данных, что оставляет больше времени для обработки потока сокетов.

Итак, для этого решения вам нужно queue<std::pair<key,value> >, сказать std::queueдля обработки обоим потокам при их инициализации или, в качестве альтернативы, статическому экземпляру типа multimap один. Затем просто замените multimap::insert в первой теме queue::push_back из make_pair(key, value)и симметрично в потоке потребителя fisrt имеют pop_front Из всех ожидающих пар в очереди, одновременно вставляя их в карту, затем осуществите обработку вашей карты, какой бы она ни была.

Замечания:

Имейте в виду, что если вы используете мультикарту, вы можете получить несколько значений для одного и того же ключа: вызов find вернет итератор, и вам, возможно, придется проверить следующие записи мультикарты, чтобы убедиться, что вы получаете все значения с одинаковыми ключами.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]