Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Удаление объекта из одного потока во время исполнения метода в другом (способ защиты)

Есть поток который постоянно пробегается по достаточно большому вектору и у каждого объекта вызывает определенный вектор. Есть другой поток(по сути GC) который при определенных условиях извлекает некоторые объекты из вектора и удаляет их. Есть два вопроса: Приведет ли удаление объекта, во время исполнение его методов(с обращением к внутренним полям объекта) к непредсказуемому/нестабильному поведению программы? Если да, то какой из способов защиты будет менее затратный по времени: Mutex или Умный указатель? (какие еще могут быть варианты для c++11?) Спасибо.


Ответ

Возможно более эффективным будет другой подход (без GC в другом потоке). Перед каждой очередной пробежкой по большому вектору, Вы вычисляете условие, при котором по нему шел бы поток GC и запускаете функцию GC для этого вектора (в том же потоке). Разумеется, она должна уметь эффективно уплотнять вектор (IMHO тривиальный v.erase() каждый раз будет сдвигать хвост влево). Затем продолжаете свои игры (нормальный ход алгоритма). Конечно, у этого подхода есть определенные минусы (прежде всего код "захламляется"), но в плюс - большая предсказуемость тестирования (IMHO) и м.б. скорость обработки.

Комментариев нет:

Отправить комментарий