`struct MyClass {
~MyClass() {
// Asynchronously invoke deletion (erase) of entries from my_map;
// Different entries are deleted in different threads.
// Need to spin as 'this' object is shared among threads and
// destruction of the object will result in seg faults.
while(my_map.size() > 0); // This spins for ever due to complier optimization.
}
unordered_map<key, value> my_map;
};`
У меня есть вышеупомянутый класс, в котором элементы неупорядоченной карты асинхронно удаляются в деструкторе, и я должен spin / sleep, поскольку объект является общим для других потоков. Я не могу объявить my_map
как volatile
, так как это приводит к ошибкам компиляции. Что еще я могу сделать здесь? Как мне сказать компилятору, что my_map.size()
приведет к 0 в какой-то момент времени. Пожалуйста, не говорите мне, почему / как этот дизайн плох; Я не могу изменить дизайн, поскольку он связан по причине, которую я не могу объяснить, если я не напишу здесь тысячи строк кода.
Редактировать: my_map
защищен с использованием версии спин-блокировки. Итак, потоки захватывают спин-блокировку перед удалением записей. Просто while(my_map.size() > 0);
был единственным «наивным» вращением, которое я имел в коде. Я преобразовал это, чтобы захватить спин-блокировку и затем проверить размер (в цикле), и это работало. Хотя использование condition_variable
было бы правильным способом, мы используем модель асинхронного программирования (например, SEDA), которая связывает нас с , а не использованием любых спящих / вызывающих вызовов.