LINUX.ORG.RU
Ответ на: комментарий от anonymous

Ну от стандарта мы ушли совсем... ладно
Попробуем разобраться в релизации...

Фокус в том что в приведенном примере компилятор (для x86) НЕ МОЖЕТ 
ГАРАНТИРОВАТЬ атомарность при операции сравнения 2-х volatile переменных (одной - может) ... более того тут вскользь упомянули RISC процессоры (load-store, да) где эта гарантия невозможна совсем (код для ARM приведу ниже)

смотрим дальше:

   movl    -4(%ebp), %edx
                                       < вот тут происходит, к примеру,   прерывание и _нечто_ меняет содержимое -4(%ebp)
   movl    -4(%ebp), %eax  

Про _вероятность_ этого и ругнулся icc

Пример с 1-й volatile генерирует вполне корректный код:
icc:
        movl      $0, (%esp)                                    #3.14
        movl      (%esp), %eax                                  #6.6
        cmpl      $1, %eax 
gcc:
        movl    -4(%ebp), %eax
        cmpl    -8(%ebp), %eax

А вот для ARM такая гарантия не возможна В ПРИНЦИПЕ
что с volatile что без код получается АБСОЛЮТНО одинаковым
gcc-arm:
             ldr     r2, [fp, #-16]
             ldr     r3, [fp, #-20]
             cmp   r2, r3

Раз нет гарантии ну не все ли  равно ЧТО написать в условии, результат будет случайным в любом случае (ну разве что с разной степенью вероятности)

Что однако не отменяет стандарт (то же самое про register)     

sS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.