C++ ориентированная на многопотоковое исполнение карта

Если я правильно понял, это должно сработать:

sum(a != b for a, b in zip(listA, listB))

Дает ожидаемый результат 2.

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

14
задан Deduplicator 12 October 2018 в 02:21
поделиться

5 ответов

Не соответствует указанным критериям, но вы можете взглянуть на контейнеры TBB . Существует так называемое concurrent_hash_map , которое позволяет нескольким потокам одновременно получать доступ к данным на карте. Есть некоторые детали, но все хорошо документировано и может дать вам представление о «параллельном контейнере». В зависимости от ваших потребностей это может быть совершенно неуместно ...

11
ответ дан 1 December 2019 в 13:10
поделиться

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

Попытка создания потоково-безопасных контейнеров была ошибкой в ​​Java и ошибкой в ​​C ++.

1
ответ дан 1 December 2019 в 13:10
поделиться

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

4
ответ дан 1 December 2019 в 13:10
поделиться

Повышение shared_mutex обеспечит лучший подход для нескольких читателей / писателей к переносу стандартной карты с учетом ваших ограничений. Я не знаю каких-либо «готовых» реализаций, которые объединяют эти два, так как задача обычно тривиальна.

2
ответ дан 1 December 2019 в 13:10
поделиться

Попробуйте эту библиотеку

http://www.codeproject.com/KB/threads/lwsync.aspx

Она реализована в современном подходе на основе политик c ++.

Вот несколько вырезок из ссылки, чтобы показать идею с «векторным» случаем

typedef lwsync::critical_resource<std::vector<int> > sync_vector_t;
sync_vector_t vec;

// some thread:
{
   // Critical resource can be naturally used with STL containers.
   sync_vector_t::const_accessor vec_access = vec.const_access();
   for(std::vector<int>::const_iterator where = vec_access->begin();
         where != vec_access->end();
         ++where;
        )
   std::cout << *where << std::endl;
}

sync_vector_t::accessor some_vector_action()
{
   sync_vector_t::accessor vec_access = vec.access();
   vec_access->push_back(10);
   return vec_access;
   // Access is escalated from within a some_vector_action() scope
   // So that one can make some other action with vector before it becomes
   // unlocked.
}

{
   sync_vector_t::accessor vec_access = some_vector_action();
   vec_access->push_back(20);
   // Elements 10 and 20 will be placed in vector sequentially.
   // Any other action with vector cannot be processed between those two
   // push_back's.
}
1
ответ дан 1 December 2019 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: