У меня есть std::list<Info> infoList
в моем приложении, которое делится между двумя потоками. Эти 2 потока получают доступ к этому списку следующим образом:
Тема 1: использует push_back()
, pop_front()
или clear()
в списке (в зависимости от ситуации)
Тема 2: использует iterator
для перебора элементов в списке и выполнения некоторых действий.
В потоке 2 выполняется итерация списка следующим образом:
for(std::list<Info>::iterator i = infoList.begin(); i != infoList.end(); ++i)
{
DoAction(i);
}
Код компилируется с использованием GCC 4.4.2.
Иногда ++ я вызывает segfault и сбой приложения. Ошибка вызывается в строке 143 std_list.h в следующей строке:
_M_node = _M_node->_M_next;
Я предполагаю, что это гоночное состояние. Список может быть изменен или даже очищен потоком 1, а поток 2 - итерацией.
Я использовал Mutex для синхронизации доступа к этому списку, и во время моего первоначального теста все прошло нормально. Но система просто зависает при стресс-тестах, что делает это решение совершенно неприемлемым. Это приложение является приложением в реальном времени, и мне нужно найти решение, чтобы оба потока могли работать как можно быстрее, не повредив общую пропускную способность приложений.
Мой вопрос таков: Thread 1 и Thread 2 необходимо выполнить как можно быстрее, так как это приложение реального времени. что я могу сделать, чтобы предотвратить эту проблему и все еще поддерживать производительность приложения? Существуют ли какие-либо блокирующие алгоритмы для такой проблемы?
Хорошо, если я пропущу некоторые недавно добавленные объекты Info
в итерации потока 2, но что я могу сделать, чтобы предотвратить итератор, чтобы он стал висящим указателем?
Спасибо