Re[2]: Порядок создания объектов
От: _NN_ www.nemerleweb.com
Дата: 31.05.23 10:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Более того, если убрать нитку, то ничего не поменяется:

BFE>
BFE>Tool tool{};
BFE>printf("Starting tool");
BFE>

BFE>Если конструктор Tool не имеет побочных эффектов, то нет гарантии, что вызов функции printf("Starting tool"); будет произведён после (что бы это не значило) создания объекта tool. Вообще говоря стандартом не запрещается параллельное выполнение этого кода, скажем, на двух разных процессорах: на одном создание объекта tool, а на втором выполнение функции printf.

А если у нас есть инициализация переменной ?

int i{ 10 };
std::thread t( [&i] { printf("%d", i); } );


Как я понимаю даже если компилятор понимает, что порядок менять нельзя, присваивание значения 10 может не отразится при чтении из другого потока. Верно ?
То есть даже в таком коде нам нужен барьер памяти, чтобы поток прочитал именно то, что нужно.


В таком случае atomic<int> также не спасает ведь инициализация не автомарная:
std::atomic<int> i{ 10 }; // 2) Initializes the underlying object with desired. The initialization is not atomic.
std::thread t( [&i] { printf("%d", i); } );
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.