Если у вас есть мьютекс для каждой строки / столбца, у вас будет условие гонки, когда поток записи строки и поток чтения столбца получат доступ к элементу на пересечении строки / столбца. Если у вас большая матрица, вам понадобится много мьютексов. Я не уверен, что каждая операционная система может обеспечить тысячи мьютексов.
Похоже, потокобезопасная очередь производителя-потребителя была бы лучшим решением вашей проблемы. Ознакомьтесь с библиотекой Intel Thread Building Blocks (TBB). Я считаю, что многопоточность становится намного проще, когда вы моделируете свою программу, используя парадигму потока данных.
Если вы хотите уменьшить объем памяти больших, разреженных матриц, посмотрите Boost.uBlas . Он имеет шаблонный класс sparce_matrix
, который использует карту для ассоциативного хранения элементов по индексам.
По соображениям эффективности вы не захотите передавать целые матрицы путем копирования в свою очередь производителя-потребителя. Вместо этого вы захотите обойти прокси своих разреженных матриц. Если у TBB еще нет какого-либо прокси-сервера, вы можете просто использовать boost :: shared_ptr. Вы также можете иметь заранее выделенный пул матриц, которые перерабатываются в «схеме» потока данных.