Страницы

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

вторник, 28 января 2020 г.

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

#многопоточность #cpp11 #cpp


Есть поток который постоянно пробегается по достаточно большому вектору и у каждого
объекта вызывает определенный вектор. Есть другой поток(по сути GC) который при определенных
условиях извлекает некоторые объекты из вектора и удаляет их.

Есть два вопроса:

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

Спасибо.    


Ответы

Ответ 1



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

Ответ 2



Удаление объекта, с которым работает другой поток — классический случай undefined behaviour. Не делайте так. В C++ настоящий GC реализовать довольно сложно, я бы пошёл по рекомендуемому пути и воспользовался shared_ptr. Однако, если вам нужно работать с объектом (не с указателем на него!) из нескольких потоков, вам понадобится mutex.

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

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