Компилятор Delphi


Где в Delphi "volatile"?
Октябрь 11, 2016 – 06:25
EXE и компилятор Delphi

У Алены в посте про явные и скрытые особенности volatile-переменных в C++ идет обсуждение того, почему этот volatile необходим в многопоточных приложениях. И я задумался, почему его нет в Delphi, и как оно вообще без него работает.

В частности есть совершенно классическая модель работы thread'а, когда он что-то делает в цикле, и периодически проверяет, не надо ли экстренно прерваться:

procedure Execute; begin while not Terminated do begin ... end; end;

Так вот в C++, если эта самая Terminated — обычная булевская переменная, то компилятор может внести оптимизацию. Видя, что переменная не меняется в цикле, он считает ее один раз в регистр и не будет каждый раз лезть за ней в память. И получается, что попытки изменить ее извне thread'а ничего не изменят, цикл будет крутиться вечно. Чтобы такого не происходило, переменную объявляют как volatile, что заставляет компилятор не применять к ней таких оптимизаций.

В Delphi такого слова нет. И компилятор у Delphi весь из себя тоже оптимизирующий, и я где-то даже определенно встречал, что переменные из циклов он исключать умеет. И тем не менее, хоть я и писал довольно много многопоточного софта, но ни разу таких проблем не встречал. Почему?

У меня появилась одна теория. Ведь Terminated в Delphi — это не переменная, а метод, который читает пирватную FTerminated у класса TThread. И устанавливается она тоже не напрямую, а через метод Terminate. "Ага!" — подумал я, и написал пример, где вместо Terminated используется простая булевская переменная. Все равно работает!

Source: softwaremaniacs.org
Похожие публикации