Есть несколько опций, среди которых:
Опция 1
Предоставить каждому аккаунту свой мьютекс.Убедитесь, что когда поток хочет заблокировать две записи (например, для передачи), он всегда просматривает их в одном и том же порядке - например, сначала с наименьшим номером.
Затем потоки просто получают мьютексы нужных им записей.изменить (всегда соблюдая правильный порядок блокировки, чтобы избежать взаимоблокировки), внести их изменения, а затем освободить мьютексы.
Опция 2
Свернуть свои собственные блокировки на уровне записи.Установите переменную для каждой записи учетной записи, заблокирована ли эта учетная запись.Это может быть внутри массива учетных записей или в отдельной структуре данных.Используйте один мьютекс для защиты доступа ко всем флагам блокировки и CV, чтобы помочь потокам в ожидании получения блокировки.
Затем потоки работают по следующему шаблону:
- Заблокируйте мьютекс.
- Если все необходимые записи разблокированы, включите их флаги блокировки и перейдите к шагу 4.
- Подождите резюме, затем вернитесь к шагу 2.
- Отключение мьютекса
- Выполнение всех (других) модификаций учетной записи
- Повторная блокировка мьютекса
- Отключение всех блокировок записей, полученных вШаг 2.
- Трансляция в CV и освобождение мьютекса.
Вариант 2 имеет больше конфликтов потока, чем вариант 1, и, следовательно, на практике, возможно, несколько меньше параллелизма,но это компромисс, связанный с использованием только одного мьютекса.Вы можете решить эту проблему в некоторой степени с помощью гибридного решения, которое разделит учетные записи на группы и позволит реализовать вариант 2 для каждой группы.