std::atomic и VS2015 Update 2
От: Teolog  
Дата: 24.05.16 12:00
Оценка:
После перевода проекта на 2015 как обычно все сломалось.
При изучении обнаружилась интересная вещь
в конструкции типа
class blabla
{
public:
blabla();
private:
std::atomic<bool> TestValue;
}
blabla::blabla() /*:TestValue(false)*/
{

}

TestValue после срабатывания конструктора равно true. Если разкомментить то все нормально. На 2013 честно было false в обоих случаях.
В логе изменений версии написано что они там что-то такое доработали с оператором =, возможно увлеклись.
Вопрос в том, являеться ли это багом. По-моему-являеться, но есть некоторые сомнения.
Re: std::atomic и VS2015 Update 2
От: uzhas Ниоткуда  
Дата: 24.05.16 12:06
Оценка: +1
Здравствуйте, Teolog, Вы писали:

T>После перевода проекта на 2015 как обычно все сломалось.

...
T>TestValue после срабатывания конструктора равно true. Если разкомментить то все нормально. На 2013 честно было false в обоих случаях.

Мы тоже на эти грабли попали, т.к. у студии поведение поменялось и она перестала инициализировать атомики.
Это полностью соответствует стандарту, см. http://en.cppreference.com/w/cpp/atomic/atomic/atomic
Так что нормальный путь — это найти все места и проинициализировать атомики в коде явно
Есть очень удобный метод инициализации:
class blabla
{
private:
  std::atomic<bool> TestValue = false;
};


У нас большинство проблем было выявлено автотестами.
Re[2]: std::atomic и VS2015 Update 2
От: Teolog  
Дата: 24.05.16 12:22
Оценка:
Печально это. Починить все починил понятно, но как-то это эзотерично выходит.
Придется теперь следить еще за одной ерундой вида-не пытайся понять, просто запомни.
И кому этот конструктор мешал?

Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, Teolog, Вы писали:


T>>После перевода проекта на 2015 как обычно все сломалось.

U>...
T>>TestValue после срабатывания конструктора равно true. Если разкомментить то все нормально. На 2013 честно было false в обоих случаях.

U>Мы тоже на эти грабли попали, т.к. у студии поведение поменялось и она перестала инициализировать атомики.

U>Это полностью соответствует стандарту, см. http://en.cppreference.com/w/cpp/atomic/atomic/atomic
U>Так что нормальный путь — это найти все места и проинициализировать атомики в коде явно
U>Есть очень удобный метод инициализации:
U>
U>class blabla
U>{
U>private:
U>  std::atomic<bool> TestValue = false;
U>};
U>


U>У нас большинство проблем было выявлено автотестами.
Re[3]: std::atomic и VS2015 Update 2
От: Igore Россия  
Дата: 24.05.16 13:00
Оценка:
Здравствуйте, Teolog, Вы писали:

T>Печально это. Починить все починил понятно, но как-то это эзотерично выходит.

T>Придется теперь следить еще за одной ерундой вида-не пытайся понять, просто запомни.
Такое поведение для всех встроенных типов, не инициализируешь, в нём мусор.
T>И кому этот конструктор мешал?
Похоже решили сделать одинаково со встроенными типами.
Re[4]: std::atomic и VS2015 Update 2
От: Teolog  
Дата: 24.05.16 13:50
Оценка:
Так в том то и дело, что выглядит оно не как встроенный тип, а как шаблон класса.
Соответственно первая и последняя мысль по поводу инициализации: как-нибудь само.
А про встроенные типы я понятно в курсе, еще одни любимые грабли. Диагностики нет, без статического анализатора фиг догадаешься что забыл чего-нибудь инициализировать в классе. Отладочная работает нормально, а релизная с вероятностью 50% от запуска к запуску ). Был у меня уже симулятор морской рации который связывался с вероятностью 50%. Неделю страдал с ним пока разобрался.
Здравствуйте, Igore, Вы писали:

I>Здравствуйте, Teolog, Вы писали:


T>>Печально это. Починить все починил понятно, но как-то это эзотерично выходит.

T>>Придется теперь следить еще за одной ерундой вида-не пытайся понять, просто запомни.
I>Такое поведение для всех встроенных типов, не инициализируешь, в нём мусор.
T>>И кому этот конструктор мешал?
I>Похоже решили сделать одинаково со встроенными типами.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.