InterlockedExchange
От: yury_alpatov  
Дата: 19.09.11 08:24
Оценка:
Как применить данную функцию для типа отличного от LONG. В частности есть массив BYTE* ImageInfo, нужно заменить конкретный элемент атомарно.
Re: InterlockedExchange
От: ononim  
Дата: 19.09.11 09:07
Оценка:
_>Как применить данную функцию для типа отличного от LONG. В частности есть массив BYTE* ImageInfo, нужно заменить конкретный элемент атомарно.
во-первых выделять массив ImageInfo на выровненный по 4 байтовой границе адрес
во-вторых выделять под массив кратное 4м байтам количество памяти
в-третьих както так (не компилял, не тестил):
BYTE InterlockedExchangeArrayByte(PBYTE array, size_t index, BYTE val)
{
const size_t aligned_index = (index& ~(size_t)3);
const size_t align_shift = (index&3) * 8;
const ULONG value_and = ~(((ULONG)0xff) << align_shift);
const ULONG value_or = ((ULONG)val) << align_shift;
for (;;)
{
const ULONG oldv = *(PULONG)&ImageInfo[aligned_index];
const ULONG newv = (oldv&value_and) | value_or;
const ULONG excv = (ULONG)InterlockedCompareExchange((volatile long *)&ImageInfo[aligned_index], (LONG)newv, (LONG)oldv);
if (excv==oldv) return ((oldv& ~value_and)>>align_shift);
SwitchToThread();
}
}
Как много веселых ребят, и все делают велосипед...
Re: InterlockedExchange
От: rus blood Россия  
Дата: 19.09.11 09:41
Оценка: 6 (1) +1
Здравствуйте, yury_alpatov, Вы писали:

_>Как применить данную функцию для типа отличного от LONG. В частности есть массив BYTE* ImageInfo, нужно заменить конкретный элемент атомарно.

__forceinline BYTE _InterlockedExchange8(volatile BYTE* ps, BYTE s)
{
    __asm
    {
        mov    edx,    DWORD PTR ps
        xor    eax,    eax
        mov    al,    s
        xchg    BYTE PTR [edx], al
    }
}


PS
Использование на свое усмотрение.
Имею скафандр — готов путешествовать!
Re: InterlockedExchange
От: CoolCmd Россия  
Дата: 19.09.11 10:18
Оценка:
Здравствуйте, yury_alpatov, Вы писали:

_>Как применить данную функцию для типа отличного от LONG. В частности есть массив BYTE* ImageInfo, нужно заменить конкретный элемент атомарно.


В VC2010 есть intrinsic функция _InterlockedCompareExchange8()
Т.е. делаешь как-то так:

#pragma intrinsic(_InterlockedCompareExchange8)

volatile char c;
_InterlockedCompareExchange8(&c, 0, 0);
простите, я убил небо
Re[2]: InterlockedExchange
От: CoolCmd Россия  
Дата: 19.09.11 10:21
Оценка: -2
Здравствуйте, rus blood, Вы писали:

RB> __asm

RB> {
RB> mov edx, DWORD PTR ps
RB> xor eax, eax
RB> mov al, s
RB> xchg BYTE PTR [edx], al
RB> }
RB>PS
RB>Использование на свое усмотрение.
В х64 нет встроенного ассемблера. И ты вроде бы lock забыл?
простите, я убил небо
Re[3]: InterlockedExchange
От: rus blood Россия  
Дата: 19.09.11 10:23
Оценка: 1 (1)
Здравствуйте, CoolCmd, Вы писали:

CC>В х64 нет встроенного ассемблера. И ты вроде бы lock забыл?


Про x64 речи не было.
И про lock я не забыл
Имею скафандр — готов путешествовать!
Re[3]: InterlockedExchange
От: mike_rs Россия  
Дата: 19.09.11 10:30
Оценка: +1 -1
Здравствуйте, CoolCmd, Вы писали:

CC>В х64 нет встроенного ассемблера. И ты вроде бы lock забыл?

есть, при использовании компилятора intel
Re[2]: InterlockedExchange
От: CoolCmd Россия  
Дата: 19.09.11 10:31
Оценка:
Здравствуйте, CoolCmd, Вы писали:
CC>В VC2010 есть intrinsic функция _InterlockedCompareExchange8()
И _InterlockedExchange8() тоже есть.

Здравствуйте, rus blood, Вы писали:
RB>И про lock я не забыл
Да, это я забыл что xchg он не нужен.
простите, я убил небо
Re[3]: InterlockedExchange
От: Banned by IT  
Дата: 19.09.11 15:33
Оценка: 1 (1) -1
Здравствуйте, CoolCmd, Вы писали:

CC>В х64 нет встроенного ассемблера.

В компиляторе от MS нет. В нормальных — есть.

CC> И ты вроде бы lock забыл?

xchg автоматически выставляет lock
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: InterlockedExchange
От: Banned by IT  
Дата: 19.09.11 15:46
Оценка:
Здравствуйте, mike_rs, Вы писали:

CC>>В х64 нет встроенного ассемблера. И ты вроде бы lock забыл?

_>есть, при использовании компилятора intel
И это меня кстати недавно безумно порадовало.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: InterlockedExchange
От: CoolCmd Россия  
Дата: 19.09.11 17:07
Оценка: :)
Здравствуйте, Banned by IT, Вы писали:

CC>>В х64 нет встроенного ассемблера.

BBI>В компиляторе от MS нет. В нормальных — есть.
Учитывая, что нормальный компилятор есть только у МС, твое предложение не имеет смысла.

CC>> И ты вроде бы lock забыл?

BBI>xchg автоматически выставляет lock
Наоборот!
простите, я убил небо
Re[4]: InterlockedExchange
От: Banned by IT  
Дата: 19.09.11 17:15
Оценка:
Здравствуйте, CoolCmd, Вы изволили не согласиться с приведёнными фактами?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: InterlockedExchange
От: Banned by IT  
Дата: 19.09.11 17:21
Оценка:
Здравствуйте, CoolCmd, Вы писали:

CC>>>В х64 нет встроенного ассемблера.

BBI>>В компиляторе от MS нет. В нормальных — есть.
CC>Учитывая, что нормальный компилятор есть только у МС, твое предложение не имеет смысла.
Ви таки делаете мне смешно.
По последним моим тестам оптимизации для криптографических примитивов ICC сделал MSVC как бык овцу: скорость работы кода отличалась в 2 раза.

CC>>> И ты вроде бы lock забыл?

BBI>>xchg автоматически выставляет lock
CC>Наоборот!
Это как? Префикс Lock автоматически делает xchg?

Ликбез:
http://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-ia32-architectures/

On most instructions a lock prefix must be explicitly used except for the xchg instruction where the lock prefix is implied if the instruction involves a memory address.

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: InterlockedExchange
От: CoolCmd Россия  
Дата: 20.09.11 09:56
Оценка:
Здравствуйте, Banned by IT, Вы писали:

BBI>Здравствуйте, CoolCmd, Вы изволили не согласиться с приведёнными фактами?

Оффтопик
простите, я убил небо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.