Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>В System.Threading.Interlocked есть только Exchange для знаковых типов (int,long). А мне нужно для UInt32...
используй
unchchedked {
int a = __uintValue__;
Interlocked.Exchange(...);
__uintValue__ = a;
}
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>В System.Threading.Interlocked есть только Exchange для знаковых типов (int,long). А мне нужно для UInt32...
КД>И чего-то я туплю
Часть тупления я разрулил.
Оказывается, что 32-битная kernel32.dll экспортирует InterlockedExchange, через которую можно было замутить этот обмен. Что я и пытался вначале сделать.
Но в 64-битных программах реализация InterlockedExchange генерируется компилятором прямо в точке вызова. И, соответственно, kernel32 эту функцию больше не экспортирует.
Вот ведь...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Mab, Вы писали:
Mab>Во-первых, здесь пропущен явный каст, а во-вторых, при таком способе атомарность будет успешна сломана.
естессно, что имелось в виду сома использование unchecked . а как именно — тема отдельная.
А атомарность обмена останется, конечно же просто глобал, передаваемый через ref должен быть типа int без всяких кастов. я же правильно помню, что через ref передается глобальный флаг?
Во-вторых в 4-м .Net есть оверлоад генериковый
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Привет всем.
КД>Как средствами 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 — в конечном счете, на уровне машинных команд одно и то же.
Здравствуйте, Mab, Вы писали:
Mab>Наверное я просто не понял, что имелось в виду. Псевдокод очень псевдо оказался, в самом интересном месте стоит многоточие Mab>Хранить придется ровно тот тип, для которого бывает Interlocked-операция, а перед тем, как ее выполнять, кастить пользовательское значение.
... << RSDN@Home 1.2.0 alpha 5 rev. 1538>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Привет всем.
КД>Как средствами C# замутить Interlocked.Exchange для UInt32?
А нафига тебе UInt32? не проще с int работать, а там где нужен UInt32 выполнять unchecked cast?
КД>И чего-то я туплю
Скорее всего да.
Здравствуйте, gandjustas, Вы писали:
КД>>Как средствами C# замутить Interlocked.Exchange для UInt32? G>А нафига тебе UInt32? не проще с int работать, а там где нужен UInt32 выполнять unchecked cast?
КД>>И чего-то я туплю G>Скорее всего да.
G>А вообще какую задачу решать собираешься?
Опять ты? А я уже начал переживать ...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --