У меня есть некоторый код C ++, который использует локальную область, объект времени жизни программы, например
void testFunction(int arg) {
static Tested tested(0);
tested.use(arg);
}
который прекрасно работал со старыми версиями GCC.
С GCC 8.2.0 я получаю удивительное предупреждение во время ссылки:
предупреждение: используется устаревшая совместимая __sync_synchronize. Не подходит для многопоточных приложений
Он указывает строку, определяющую проверенный, и действительно есть вызов __sync_synchronize (), который был сгенерирован компилятором. Я предполагаю, что это необходимо для того, чтобы никакие два потока не могли запустить инициализирующий код одновременно и чтобы ленивая инициализация приводила к тому же результату, как если бы была инициализация во время загрузки.
Проблема воспроизводится с этой реализацией класса Tested:
class Tested {
int sum;
public:
Tested(int init) : sum(init) {}
void use(int arg) {
sum += arg;
}
int current() const {
return sum;
}
};
Ожидается, что этот код будет работать на монопоточной встроенной платформе.
Правильно ли я верю, что предупреждение не имеет отношения к мне?
Что я могу сделать (помимо прекращения использования статического объекта), чтобы избавиться от предупреждающего сообщения?
Задача ещё не решена.
Других решений пока нет …