У меня есть некоторый код 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;
}
};
Ожидается, что этот код будет работать на монопоточной встраиваемой платформе.
Верно ли я считаю, что предупреждение не относится ко мне?
Что я могу сделать (помимо прекращения использования статического объекта), чтобы избавиться от предупреждающего сообщения?