Работает ли Interlocked.CompareExchange (double, double, double) в 32-битной ОС? - PullRequest
3 голосов
/ 17 декабря 2009

Я поддерживаю класс высокой производительности, которым могут управлять несколько потоков. Многие из полей являются изменчивыми целыми числами, и, как оказалось, мне нужно обновить одно из них до двойного. Мне любопытно, есть ли для этого свободный от блокировок способ, и мне было интересно, работает ли Interlocked.CompareExchange(double, double, double), как объявлено на 32-битной ОС, или он разрывается, читает проблему.

Ответы [ 3 ]

2 голосов
/ 17 декабря 2009

На этой странице подробно описываются "родные" функции блокировки. Упоминаются следующие ограничения

Поскольку _InterlockedCompareExchange64 использует инструкцию cmpxchg8b, она недоступна на процессорах, предшествующих Pentium, таких как 486.

Таким образом, мы можем ожидать, что она доступна и также реализована как операция с блокированными инструкциями (вместо того, чтобы моделироваться с использованием полной блокировки).

1 голос
/ 17 декабря 2009

Да, это работает, как описано на 32-битной. Вот для чего существуют методы Interlocked.

0 голосов
/ 07 июля 2011

Да, это работает.

Он использует InterlockedCompareExchange64 - если вы хотите взглянуть на возможную реализацию в x86 asm, посмотрите здесь - http://qc.embarcadero.com/wc/qcmain.aspx?d=6212.

asm
//     ->          EAX     Destination 
//                 ESP+4   Exchange    
//                 ESP+12  Comperand   
//     <-          EDX:EAX Result      
          PUSH    EBX
          PUSH    EDI

          MOV     EDI, EAX

          MOV     EAX, DWORD PTR [Comperand]
          MOV     EDX, DWORD PTR [Comperand+4]

          MOV     EBX, DWORD PTR [Exchange]
          MOV     ECX, DWORD PTR [Exchange+4]

LOCK      CMPXCHG8B [EDI]

          POP     EDI
          POP     EBX
end;
...