Re: Interlocked.Exchange для UInt32
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 29.10.11 15:24
Оценка: 1 (1) +1
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Привет всем.


КД>Как средствами C# замутить Interlocked.Exchange для UInt32?

А нафига тебе UInt32? не проще с int работать, а там где нужен UInt32 выполнять unchecked cast?

КД>И чего-то я туплю

Скорее всего да.

А вообще какую задачу решать собираешься?
Re[2]: Interlocked.Exchange для UInt32
От: Mab Россия http://shade.msu.ru/~mab
Дата: 29.10.11 07:41
Оценка: +1
Здравствуйте, Hacker_Delphi, Вы писали:

Во-первых, здесь пропущен явный каст, а во-вторых, при таком способе атомарность будет успешна сломана.
Re[2]: Interlocked.Exchange для UInt32
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.10.11 15:32
Оценка: -1
Здравствуйте, gandjustas, Вы писали:

КД>>Как средствами C# замутить Interlocked.Exchange для UInt32?

G>А нафига тебе UInt32? не проще с int работать, а там где нужен UInt32 выполнять unchecked cast?

КД>>И чего-то я туплю

G>Скорее всего да.

G>А вообще какую задачу решать собираешься?


Опять ты? А я уже начал переживать ...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Interlocked.Exchange для UInt32
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.10.11 06:42
Оценка:
Привет всем.

Как средствами C# замутить Interlocked.Exchange для UInt32?

В System.Threading.Interlocked есть только Exchange для знаковых типов (int,long). А мне нужно для UInt32...

И чего-то я туплю
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Interlocked.Exchange для UInt32
От: Hacker_Delphi Россия  
Дата: 29.10.11 06:55
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>В System.Threading.Interlocked есть только Exchange для знаковых типов (int,long). А мне нужно для UInt32...


используй
unchchedked { 
    int a = __uintValue__;
    Interlocked.Exchange(...);
    __uintValue__ = a;
}
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Interlocked.Exchange для UInt32
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.10.11 07:38
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>В System.Threading.Interlocked есть только Exchange для знаковых типов (int,long). А мне нужно для UInt32...


КД>И чего-то я туплю


Часть тупления я разрулил.

Оказывается, что 32-битная kernel32.dll экспортирует InterlockedExchange, через которую можно было замутить этот обмен. Что я и пытался вначале сделать.

Но в 64-битных программах реализация InterlockedExchange генерируется компилятором прямо в точке вызова. И, соответственно, kernel32 эту функцию больше не экспортирует.

Вот ведь...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Interlocked.Exchange для UInt32
От: Hacker_Delphi Россия  
Дата: 29.10.11 07:56
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Во-первых, здесь пропущен явный каст, а во-вторых, при таком способе атомарность будет успешна сломана.

естессно, что имелось в виду сома использование unchecked . а как именно — тема отдельная.
А атомарность обмена останется, конечно же просто глобал, передаваемый через ref должен быть типа int без всяких кастов. я же правильно помню, что через ref передается глобальный флаг?
Во-вторых в 4-м .Net есть оверлоад генериковый
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Interlocked.Exchange для UInt32
От: Pavel Dvorkin Россия  
Дата: 29.10.11 08:12
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Привет всем.


КД>Как средствами C# замутить Interlocked.Exchange для UInt32?


КД>В System.Threading.Interlocked есть только Exchange для знаковых типов (int,long). А мне нужно для UInt32...


КД>И чего-то я туплю


Можно вместо UInt32 использовать IntPtr, завернув в него Uint32. Не копируя, а именно завернув.


            IntPtr ix = new IntPtr(0);
            IntPtr iy = new IntPtr(0xFFFFFFFF);
            Interlocked.Exchange(ref ix, iy);


Варварство, конечно,но что делать, если в языке нет способа объяснить, что ссылка на int и uint — в конечном счете, на уровне машинных команд одно и то же.
With best regards
Pavel Dvorkin
Re: Interlocked.Exchange для UInt32
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.10.11 08:23
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Привет всем.


КД>Как средствами C# замутить Interlocked.Exchange для UInt32?


На второй итерации я таки асилил это мутанство. С первого раза почему-то неполучилось

 public static unsafe System.UInt32 Exchange(ref System.UInt32 location,System.UInt32 value)
 {
  Int32 resultValue;

  fixed(UInt32* p=&location)
  {
   resultValue=System.Threading.Interlocked.Exchange(ref *(int*)p,*(int*)&value);
  }

  return *(UInt32*)(&resultValue);
 }//Exchange


Полагаю, это победа силы над разумом?

64-битный код (в отладчике)
  Скрытый текст
    20:  {
00000000  mov         dword ptr [rsp+10h],edx 
00000004  mov         qword ptr [rsp+8],rcx 
00000009  sub         rsp,58h 
0000000d  mov         dword ptr [rsp+20h],0 
00000015  mov         qword ptr [rsp+28h],0 
0000001e  mov         dword ptr [rsp+30h],0 
00000026  mov         rax,7FF005B8000h 
00000030  mov         eax,dword ptr [rax] 
00000032  test        eax,eax 
00000034  je          000000000000003B 
00000036  call        FFFFFFFFE8D85F30 
0000003b  nop 
    21:   Int32 resultValue;
    22: 
    23:   fixed(UInt32* p=&location)
0000003c  mov         rax,qword ptr [rsp+60h] 
00000041  mov         qword ptr [rsp+28h],rax 
    24:   {
00000046  nop 
    25:    resultValue=System.Threading.Interlocked.Exchange(ref *(int*)p,*(int*)&value);
00000047  mov         rax,qword ptr [rsp+28h] 
0000004c  mov         qword ptr [rsp+38h],rax 
00000051  mov         ecx,dword ptr [rsp+68h] 
00000055  mov         rax,qword ptr [rsp+38h] 
0000005a  xchg        ecx,dword ptr [rax] 
0000005c  mov         dword ptr [rsp+40h],ecx 
00000060  mov         eax,dword ptr [rsp+40h] 
00000064  mov         dword ptr [rsp+20h],eax 
    26:   }
00000068  nop 
00000069  mov         qword ptr [rsp+28h],0 
    27: 
    28:   return *(UInt32*)(&resultValue);
00000072  mov         eax,dword ptr [rsp+20h] 
00000076  mov         dword ptr [rsp+30h],eax 
0000007a  jmp         000000000000007C 
    29:  }//Exchange


32-битный код (в отладчике)
  Скрытый текст
    20:  {
00000000  push        ebp 
00000001  mov         ebp,esp 
00000003  push        edi 
00000004  push        esi 
00000005  push        ebx 
00000006  sub         esp,4Ch 
00000009  mov         esi,ecx 
0000000b  lea         edi,[ebp-48h] 
0000000e  mov         ecx,0Fh 
00000013  xor         eax,eax 
00000015  rep stos    dword ptr es:[edi] 
00000017  mov         ecx,esi 
00000019  xor         eax,eax 
0000001b  mov         dword ptr [ebp-1Ch],eax 
0000001e  mov         dword ptr [ebp-3Ch],ecx 
00000021  mov         dword ptr [ebp-40h],edx 
00000024  cmp         dword ptr ds:[05DE5B48h],0 
0000002b  je          00000032 
0000002d  call        640BEC23 
00000032  xor         edx,edx 
00000034  mov         dword ptr [ebp-4Ch],edx 
00000037  nop 
    21:   Int32 resultValue;
    22: 
    23:   fixed(UInt32* p=&location)
00000038  mov         eax,dword ptr [ebp-3Ch] 
0000003b  mov         dword ptr [ebp-48h],eax 
    24:   {
0000003e  nop 
    25:    resultValue=System.Threading.Interlocked.Exchange(ref *(int*)p,*(int*)&value);
0000003f  mov         eax,dword ptr [ebp-48h] 
00000042  mov         dword ptr [ebp-54h],eax 
00000045  mov         eax,dword ptr [ebp-54h] 
00000048  mov         dword ptr [ebp-58h],eax 
0000004b  mov         ecx,dword ptr [ebp-58h] 
0000004e  mov         edx,dword ptr [ebp-40h] 
00000051  call        640913C1 
00000056  mov         dword ptr [ebp-50h],eax 
00000059  mov         eax,dword ptr [ebp-50h] 
0000005c  mov         dword ptr [ebp-44h],eax 
    26:   }
0000005f  nop 
00000060  xor         edx,edx 
00000062  mov         dword ptr [ebp-48h],edx 
    27: 
    28:   return *(UInt32*)(&resultValue);
00000065  mov         eax,dword ptr [ebp-44h] 
00000068  mov         dword ptr [ebp-4Ch],eax 
0000006b  nop 
0000006c  jmp         0000006E 
    29:  }//Exchange


PS. Чорт, когда уже кодеры RSDN-а добавят cut в список кодов форматирования? Задрало. Хочу тыкать мышью.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Interlocked.Exchange для UInt32
От: Mab Россия http://shade.msu.ru/~mab
Дата: 29.10.11 09:42
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

Наверное я просто не понял, что имелось в виду. Псевдокод очень псевдо оказался, в самом интересном месте стоит многоточие

Хранить придется ровно тот тип, для которого бывает Interlocked-операция, а перед тем, как ее выполнять, кастить пользовательское значение.
Re[5]: Interlocked.Exchange для UInt32
От: Hacker_Delphi Россия  
Дата: 29.10.11 12:47
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Наверное я просто не понял, что имелось в виду. Псевдокод очень псевдо оказался, в самом интересном месте стоит многоточие


Mab>Хранить придется ровно тот тип, для которого бывает Interlocked-операция, а перед тем, как ее выполнять, кастить пользовательское значение.
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: Interlocked.Exchange для UInt32
От: Hacker_Delphi Россия  
Дата: 29.10.11 12:47
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

[skipped]

Рядом
Автор: Hacker_Delphi
Дата: 29.10.11
есть safe решение unsafe может не пройти валидацию в некоторых контекстах.
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Interlocked.Exchange для UInt32
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.10.11 15:11
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Рядом
Автор: Hacker_Delphi
Дата: 29.10.11
есть safe решение


Приведи полноценный, доходчивый и, главное, надежный код.

H_D>unsafe может не пройти валидацию в некоторых контекстах.


Будем решать проблемы в порядке их поступления.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.