Здравствуйте, ·, Вы писали:
CRT>> как компилятор может сначала вызвать b() перед a()?
CRT>> у меня это в голове не укладывается. Такого быть не должно.
·>Может, естественно, если компилятор знает, что это не влияет на наблюдаемое поведение.
чтобы это знать, компилятор должен учитывать всё что делается внутри a() и b() и так же внутри тех функций которые эти a() и b() в свою очередь вызывают и далее по цепочке. Что-то я сомневаюсь что компилятор копает
так глубоко. Хотя кто их знает...
·>Другое дело, что в начальном примере был запуск треда, который вроде как по современным стандартам (The memory model was then included in the next C++ and C standards, C++11 and C11) должен создавать барьер.
это я знаю.
вообще автор задал вопрос неоднозначно
Есть ли у нас гарантии от компилятора и от процессора, что toolRunner будет создан после того как будет создан tool ?
Что он имел в виду: создание объекта std::thread toolRunner или начало работы потока который представляется этим объектом?
Это ж не одно и то же. Конструктор объекта toolRunner и его функция потока выполняются в разных потоках.
Если считать что компилятор может конструкторы вызывать не в том порядке в котором они указаны в коде, то объект toolRunner может быть создан раньше чем tool. Но тогда получается что барьер памяти будет не работать, потому что барьер то как раз должен завершить все операции записи...
Короче, однозначно что tool уже будет проинициализирован перед запуском потока toolRunner .