LINUX.ORG.RU

История изменений

Исправление byko3y, (текущая версия) :

атомарные операции не имеют никакого отношения к volatile. существует 2 типа барьеров памяти: барьеры процессора и барьеры компиляции. volatile позволяет избегать только барьеров второго типа
единственный компилятор, у которого особое мнение на этот счет - MSVC

Это особенность даже не столько MSVC в целом, сколько архитектуры x86. Дело в том, что в x86 всегда есть барьер release на всех операциях записи, и доступ по выравненным ячейкам с размером меньше регистра - атомарен на чтение и запись. Получается, что потокобезопасность уже почти есть - просто, нет гарантии порядка чтений (фактически атомарных). В то же время, MSVC на ARM по умолчанию использует для volatile семантику свободного доступа.

Но я должен заметить, что volatile изначально разрабатывался именно и только под CISC архитектуры: intel 8080 (и производный Z80), 8086, Motorola 68000. Интересно, хоть и довольно трудоемко, узнать про компании, которые участвовали в создании стандарта C89. Возглавляли комитет Whitesmiths и AT&T. Whitesmiths были разрабами Idris на PDP-11 - того самого PDP-11, на базе которого были созданы VAX (8600, 8800), Motorola 68000, System/370, Intel 8086. А AT&T в том числе потребляла эти системы и софт, и также продавала свой AT&T 6300, базировавшийся на 8086.

В чем же такая особенность этих процессоров именно в те годы? Когда не было многоядер. А в том, что вы могли сделать «inc dword [eax]» единой командой, в промежутке которой не могли произойти прерывания — таким образом, на однопроцессорной системе вы могли делать «атомарные» операции без лишних напрягов. В RISC, однако, такой команды нет, и для увеличения ячейки памяти на единицу вам нужно считать значение в регистр, увеличить значение, записать результат в регистр - здесь на любом шаге может быть прерывание, и потому прерывания нужно временно отключать или применять дополнительные приемы (linked-load/store-conditional). Очевидно, volatile был разработан с игнорированием этой проблемы, таким образом, стандарт C89 ориентировался на узкий спектр аппаратных и программных систем еще в восьмедисятые - его устаревание уже в девяностые (с появлением ARM, SPARC, PowerPC, MIPS, и просто многопроцессорных систем) не было какой-то случайностью. Где, например, разрабы MOS 6502 и производных? Ну, то есть, почему я не вижу Rockwell или Synertek в комитете? Sun тогда продавал 68k, только-только начиная свою SPARC, причем, SunOS 4.1 из девяностых всё еще имело глобальную блокировку в ядре, будучи таким образом однопоточным в режиме ядра. Для затравочки опишу еще несколько первых по алфавиту членов комитета:

  • Alliant Computer Systems — разрабы VAX систем;
  • Amdahl — разраб IBM System/370-совместимых мейнфреймов;
  • American Cimflex и Analog Devices — к сожалению, не знаю, при чем тут они;
  • Apollo Computer — разраб рабочих станций на Motorola 68000;
  • Apple Computers — тоже Motorola 680xx;
  • Arinc — поставщик бортовых систем. Использовал никсы для своих устройств, но в остальном его роль не совсем ясна здесь
  • ...

Таким образом, C89 изначально был стандартом, который узкий круг лиц разработал для собственных нужд. Меня навела на эту мысль инфа о том, что «volatile» выполнял функция «костыля под костылём», исправления для некорректной оптимизации, поскольку такой прием актуален только для пары фирм, разрабатывавших компиляторы — какое дело остальным до этих проблем? Теперь у меня есть более веские улики — просто, не было никаких «остальных».

Например регистры или память физического устройства могут отображаться на адреса оперативной памяти. Тогда чтение или запись по таким адресам памяти будет приводить к получению или передаче данных в это физическое устройство. Либо программный код может перехватывать обращения к участку памяти и обрабатывать значения которые читаются или пишутся из/в этот участок памяти

В процессорах уже давно недопустимо использование одного лишь volatile для этих целей. Потому что кэши. Обычно просто делают «asm volatile» с нужными командами.

Исправление byko3y, :

атомарные операции не имеют никакого отношения к volatile. существует 2 типа барьеров памяти: барьеры процессора и барьеры компиляции. volatile позволяет избегать только барьеров второго типа
единственный компилятор, у которого особое мнение на этот счет - MSVC

Это особенность даже не столько MSVC в целом, сколько архитектуры x86. Дело в том, что в x86 всегда есть барьер release на всех операциях записи, и доступ по выравненным ячейкам с размером меньше регистра - атомарен на чтение и запись. Получается, что потокобезопасность уже почти есть - просто, нет гарантии порядка чтений (фактически атомарных). В то же время, MSVC на ARM по умолчанию использует для volatile семантику свободного доступа.

Но я должен заметить, что volatile изначально разрабатывался именно и только под CISC архитектуры: intel 8080 (и производный Z80), 8086, Motorola 68000. Интересно, хоть и довольно трудоемко, узнать про компании, которые участвовали в создании стандарта C89. Возглавляли комитет Whitesmiths и AT&T. Whitesmiths были разрабами Idris на PDP-11 - того самого PDP-11, на базе которого были созданы VAX (8600, 8800), Motorola 68000, System/370, Intel 8086. А AT&T в том числе потребляла эти системы и софт, и также продавала свой AT&T 6300, базировавшийся на 8086.

В чем же такая особенность этих процессоров именно в те годы? Когда не было многоядер. А в том, что вы могли сделать «inc dword [eax]» единой командой, в промежутке которой не могли произойти прерывания — таким образом, на однопроцессорной системе вы могли делать «атомарные» операции без лишних напрягов. В RISC, однако, такой команды нет, и для увеличения ячейки памяти на единицу вам нужно считать значение в регистр, увеличить значение, записать результат в регистр - здесь на любом шаге может быть прерывание, и потому для работы с регистрами прерывания нужно временно отключать или применять другой дополнительный прием. Очевидно, volatile был разработан с игнорированием этой проблемы, таким образом, стандарт C89 ориентировался на узкий спектр аппаратных и программных систем еще в восьмедисятые - его устаревание уже в девяностые (с появлением ARM, SPARC, PowerPC, MIPS, и просто многопроцессорных систем) не было какой-то случайностью. Где, например, разрабы MOS 6502 и производных? Ну, то есть, почему я не вижу Rockwell или Synertek в комитете? Sun тогда продавал 68k, только-только начиная свою SPARC, причем, SunOS 4.1 из девяностых всё еще имело глобальную блокировку в ядре, будучи таким образом однопоточным в режиме ядра. Для затравочки опишу еще несколько первых по алфавиту членов комитета:

  • Alliant Computer Systems — разрабы VAX систем;
  • Amdahl — разраб IBM System/370-совместимых мейнфреймов;
  • American Cimflex и Analog Devices — к сожалению, не знаю, при чем тут они;
  • Apollo Computer — разраб рабочих станций на Motorola 68000;
  • Apple Computers — тоже Motorola 680xx;
  • Arinc — поставщик бортовых систем. Использовал никсы для своих устройств, но в остальном его роль не совсем ясна здесь
  • ...

Таким образом, C89 изначально был стандартом, который узкий круг лиц разработал для собственных нужд. Меня навела на эту мысль инфа о том, что «volatile» выполнял функция «костыля под костылём», исправления для некорректной оптимизации, поскольку такой прием актуален только для пары фирм, разрабатывавших компиляторы — какое дело остальным до этих проблем? Теперь у меня есть более веские улики — просто, не было никаких «остальных».

Например регистры или память физического устройства могут отображаться на адреса оперативной памяти. Тогда чтение или запись по таким адресам памяти будет приводить к получению или передаче данных в это физическое устройство. Либо программный код может перехватывать обращения к участку памяти и обрабатывать значения которые читаются или пишутся из/в этот участок памяти

В процессорах уже давно недопустимо использование одного лишь volatile для этих целей. Потому что кэши. Обычно просто делают «asm volatile» с нужными командами.

Исправление byko3y, :

атомарные операции не имеют никакого отношения к volatile. существует 2 типа барьеров памяти: барьеры процессора и барьеры компиляции. volatile позволяет избегать только барьеров второго типа
единственный компилятор, у которого особое мнение на этот счет - MSVC

Это особенность даже не столько MSVC в целом, сколько архитектуры x86. Дело в том, что в x86 всегда есть барьер release на всех операциях записи, и доступ по выравненным ячейкам с размером меньше регистра - атомарен на чтение и запись. Получается, что потокобезопасность уже почти есть - просто, нет гарантии порядка чтений (фактически атомарных). В то же время, MSVC на ARM по умолчанию использует для volatile семантику свободного доступа.

Но я должен заметить, что volatile изначально разрабатывался именно и только под CISC архитектуры: intel 8080 (и производный Z80), 8086, Motorola 68000. Интересно, хоть и довольно трудоемко, узнать про компании, которые участвовали в создании стандарта C89. Возглавляли комитет Whitesmiths и AT&T. Whitesmiths были разрабами Idris на PDP-11 - того самого PDP-11, на базе которого были созданы VAX (8600, 8800), Motorola 68000, System/370, Intel 8086. А AT&T в том числе потребляла эти системы и софт, и также продавала свой AT&T 6300, базировавшийся на 8086.

В чем же такая особенность этих процессоров именно в те годы? Когда не было многоядер. А в том, что вы могли сделать «inc dword [eax]» единой командой, в промежутке которой не могли произойти прерывания — таким образом, на однопроцессорной системе вы могли делать «атомарные» операции без лишних напрягов. В RISC, однако, такой команды нет, и для увеличения ячейки памяти на единицу вам нужно считать значение в регистр, увеличить значение, записать результат в регистр - здесь на любом шаге может быть прерывание, и потому для работы с регистрами прерывания нужно временно отключать или применять другой дополнительный прием. Очевидно, volatile был разработан с игнорированием этой проблемы, таким образом, стандарт C89 ориентировался на узкий спектр аппаратных и программных систем еще в восьмедисятые - его устаревание уже в девяностые (с появлением ARM, SPARC, PowerPC, MIPS, и просто многопроцессорных систем) не было какой-то случайностью. Где, например, разрабы MOS 6502 и производных? Ну, то есть, почему-то не вижу Rockwell или Synertek в комитете? Sun тогда продавал 68k, только-только начиная свою SPARC, причем, SunOS 4.1 из девяностых всё еще имело глобальную блокировку в ядре, будучи таким образом однопоточным в режиме ядра. Для затравочки опишу еще несколько первых по алфавиту членов комитета:

  • Alliant Computer Systems — разрабы VAX систем;
  • Amdahl — разраб IBM System/370-совместимых мейнфреймов;
  • American Cimflex и Analog Devices — к сожалению, не знаю, при чем тут они;
  • Apollo Computer — разраб рабочих станций на Motorola 68000;
  • Apple Computers — тоже Motorola 680xx;
  • Arinc — поставщик бортовых систем. Использовал никсы для своих устройств, но в остальном его роль не совсем ясна здесь
  • ...

Таким образом, C89 изначально был стандартом, который узкий круг лиц разработал для собственных нужд. Меня навела на эту мысль инфа о том, что «volatile» выполнял функция «костыля под костылём», исправления для некорректной оптимизации, поскольку такой прием актуален только для пары фирм, разрабатывавших компиляторы — какое дело остальным до этих проблем? Теперь у меня есть более веские улики — просто, не было никаких «остальных».

Например регистры или память физического устройства могут отображаться на адреса оперативной памяти. Тогда чтение или запись по таким адресам памяти будет приводить к получению или передаче данных в это физическое устройство. Либо программный код может перехватывать обращения к участку памяти и обрабатывать значения которые читаются или пишутся из/в этот участок памяти

В процессорах уже давно недопустимо использование одного лишь volatile для этих целей. Потому что кэши. Обычно просто делают «asm volatile» с нужными командами.

Исправление byko3y, :

атомарные операции не имеют никакого отношения к volatile. существует 2 типа барьеров памяти: барьеры процессора и барьеры компиляции. volatile позволяет избегать только барьеров второго типа
единственный компилятор, у которого особое мнение на этот счет - MSVC

Это особенность даже не столько MSVC в целом, сколько архитектуры x86. Дело в том, что в x86 всегда есть барьер release на всех операциях записи, и доступ по выравненным ячейкам с размером меньше регистра - атомарен на чтение и запись. Получается, что потокобезопасность уже почти есть - просто, нет гарантии порядка чтений (фактически атомарных). В то же время, MSVC на ARM по умолчанию использует для volatile семантику свободного доступа.

Но я должен заметить, что volatile изначально разрабатывался именно и только под CISC архитектуры: intel 8080 (и производный Z80), 8086, Motorola 68000. Интересно, хоть и довольно трудоемко, узнать про названия компаний, которые участвовали в лоббировании стандарта C89. Возглавляли комитет Whitesmiths и AT&T. Whitesmiths были разрабами Idris на PDP-11 - того самого PDP-11, на базе которого были созданы VAX (8600, 8800), Motorola 68000, System/370, Intel 8086. А AT&T в том числе потребляла эти системы и софт, и также продавала свой AT&T 6300, базировавшийся на 8086.

В чем же такая особенность этих процессоров именно в те годы? Когда не было многоядер. А в том, что вы могли сделать «inc dword [eax]» единой командой, в промежутке которой не могли произойти прерывания — таким образом, на однопроцессорной системе вы могли делать «атомарные» операции без лишних напрягов. В RISC, однако, такой команды нет, и для увеличения ячейки памяти на единицу вам нужно считать значение в регистр, увеличить значение, записать результат в регистр - здесь на любом шаге может быть прерывание, и потому для работы с регистрами прерывания нужно временно отключать или применять другой дополнительный прием. Очевидно, volatile был разработан с игнорированием этой проблемы, таким образом, стандарт C89 ориентировался на узкий спектр аппаратных и программных систем еще в восьмедисятые - его устаревание уже в девяностые (с появлением ARM, SPARC, PowerPC, MIPS, и просто многопроцессорных систем) не было какой-то случайностью. Где, например, разрабы MOS 6502 и производных? Ну, то есть, почему-то не вижу Rockwell или Synertek в комитете? Sun тогда продавал 68k, только-только начиная свою SPARC, причем, SunOS 4.1 из девяностых всё еще имело глобальную блокировку в ядре, будучи таким образом однопоточным в режиме ядра. Для затравочки опишу еще несколько первых по алфавиту членов комитета:

  • Alliant Computer Systems — разрабы VAX систем;
  • Amdahl — разраб IBM System/370-совместимых мейнфреймов;
  • American Cimflex и Analog Devices — к сожалению, не знаю, при чем тут они;
  • Apollo Computer — разраб рабочих станций на Motorola 68000;
  • Apple Computers — тоже Motorola 680xx;
  • Arinc — поставщик бортовых систем. Использовал никсы для своих устройств, но в остальном его роль не совсем ясна здесь
  • ...

Таким образом, C89 изначально был стандартом, который узкий круг лиц разработал для собственных нужд. Меня навела на эту мысль инфа о том, что «volatile» выполнял функция «костыля под костылём», исправления для некорректной оптимизации, поскольку такой прием актуален только для пары фирм, разрабатывавших компиляторы — какое дело остальным до этих проблем? Теперь у меня есть более веские улики — просто, не было никаких «остальных».

Например регистры или память физического устройства могут отображаться на адреса оперативной памяти. Тогда чтение или запись по таким адресам памяти будет приводить к получению или передаче данных в это физическое устройство. Либо программный код может перехватывать обращения к участку памяти и обрабатывать значения которые читаются или пишутся из/в этот участок памяти

В процессорах уже давно недопустимо использование одного лишь volatile для этих целей. Потому что кэши. Обычно просто делают «asm volatile» с нужными командами.

Исходная версия byko3y, :

атомарные операции не имеют никакого отношения к volatile. существует 2 типа барьеров памяти: барьеры процессора и барьеры компиляции. volatile позволяет избегать только барьеров второго типа
единственный компилятор, у которого особое мнение на этот счет - MSVC

Это особенность даже не столько MSVC в целом, сколько архитектуры x86. Дело в том, что в x86 всегда есть барьер release на всех операциях записи, и доступ по выровненным ячейкам с размером меньше регистра - атомарен на чтение и запись. Получается, что атомарность уже почти есть - просто нет гарантии порядка чтений (фактически атомарных). В то же время, MSVC на ARM по умолчанию использует для volatile семантику свободного доступа.

Но я должен заметить, что volatile изначально разрабатывался именно и только под CISC архитектуры: intel 8080 (и производный Z80), 8086, Motorola 68000. Интересно, хоть и довольно трудоемко, узнать про названия компаний, которые участвовали в лоббировании стандарта C89. Возглавляли комитет Whitesmiths и AT&T. Whitesmiths были разрабами Idris на PDP-11 - того самого PDP-11, на базе которого были созданы VAX (8600, 8800), Motorola 68000, System/370, Intel 8086. А AT&T в том числе потребляла эти системы и софт, и также продавала свой AT&T 6300, базировавшийся на 8086.

В чем же такая особенность этих процессоров именно в те годы? Когда не было многоядер. А в том, что вы могли сделать «inc dword [eax]» единой командой, в промежутке которой не могли произойти прерывания — таким образом, на однопроцессорной системе вы могли делать «атомарные» операции без лишних напрягов. В RISC, однако, такой команды нет, и для увеличения ячейки памяти на единицу вам нужно считать значение в регистр, увеличить значение, записать результат в регистр - здесь на любом шаге может быть прерывание, и потому для работы с регистрами прерывания нужно временно отключать или применять другой дополнительный прием. Очевидно, volatile был разработан с игнорированием этой проблемы, таким образом, стандарт C89 ориентировался на узкий спектр аппаратных и программных систем еще в восьмедисятые - его устаревание уже в девяностые (с появлением ARM, SPARC, PowerPC, MIPS, и просто многопроцессорных систем) не было какой-то случайностью. Где, например, разрабы MOS 6502 и производных? Ну, то есть, почему-то не вижу Rockwell или Synertek в комитете? Sun тогда продавал 68k, только-только начиная свою SPARC, причем, SunOS 4.1 из девяностых всё еще имело глобальную блокировку в ядре, будучи таким образом однопоточным в режиме ядра. Для затравочки опишу еще несколько первых по алфавиту членов комитета:

  • Alliant Computer Systems — разрабы VAX систем;
  • Amdahl — разраб IBM System/370-совместимых мейнфреймов;
  • American Cimflex и Analog Devices — к сожалению, не знаю, при чем тут они;
  • Apollo Computer — разраб рабочих станций на Motorola 68000;
  • Apple Computers — тоже Motorola 680xx;
  • Arinc — поставщик бортовых систем. Использовал никсы для своих устройств, но в остальном его роль не совсем ясна здесь
  • ...

Таким образом, C89 изначально был стандартом, который узкий круг лиц разработал для собственных нужд. Меня навела на эту мысль инфа о том, что «volatile» выполнял функция «костыля под костылём», исправления для некорректной оптимизации, поскольку такой прием актуален только для пары фирм, разрабатывавших компиляторы — какое дело остальным до этих проблем? Теперь у меня есть более веские улики — просто, не было никаких «остальных».

Например регистры или память физического устройства могут отображаться на адреса оперативной памяти. Тогда чтение или запись по таким адресам памяти будет приводить к получению или передаче данных в это физическое устройство. Либо программный код может перехватывать обращения к участку памяти и обрабатывать значения которые читаются или пишутся из/в этот участок памяти

В процессорах уже давно недопустимо использование одного лишь volatile для этих целей. Потому что кэши. Обычно просто делают «asm volatile» с нужными командами.