Если я правильно понял, это должно сработать:
sum(a != b for a, b in zip(listA, listB))
Дает ожидаемый результат 2
.
Обратите внимание, что поскольку в описании вашей проблемы указано, что порядок важен, наборы здесь не будут использоваться, поскольку они не упорядочены.
Не соответствует указанным критериям, но вы можете взглянуть на контейнеры TBB . Существует так называемое concurrent_hash_map
, которое позволяет нескольким потокам одновременно получать доступ к данным на карте. Есть некоторые детали, но все хорошо документировано и может дать вам представление о «параллельном контейнере». В зависимости от ваших потребностей это может быть совершенно неуместно ...
Это зависит от приложения, которое нужно реализовать. «Потоково-безопасное» отображение сделало бы отдельные вызовы в поточно-ориентированном отображении, но многие операции необходимо сделать поточно-ориентированными через вызовов. Приложение, использующее карту, должно связать мьютекс с картой и использовать этот мьютекс для координации доступа к ней.
Попытка создания потоково-безопасных контейнеров была ошибкой в Java и ошибкой в C ++.
Как правило, классам коллекций не рекомендуется обеспечивать безопасность потоков, поскольку они не могут знать, как они используются. Вы будете гораздо лучше обслуживаться, если будете реализовывать свои собственные механизмы блокировки в конструкциях более высокого уровня, которые используют коллекции.
Повышение shared_mutex обеспечит лучший подход для нескольких читателей / писателей к переносу стандартной карты с учетом ваших ограничений. Я не знаю каких-либо «готовых» реализаций, которые объединяют эти два, так как задача обычно тривиальна.
Попробуйте эту библиотеку
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.
}