Мне нужно использовать функцию _Interlocked*** для char или short, но в качестве входных данных требуется длинный указатель. Вроде есть функция _InterlockedExchange8, документации по ней не вижу. Похоже, это недокументированная функция. Также компилятор не смог найти функцию _InterlockedAdd8. Буду признателен за любую информацию об этих функциях, рекомендации использовать/не использовать, а также другие решения.
обновление 1
Попробую упростить вопрос. Как я могу заставить это работать?
struct X
{
char data;
};
X atomic_exchange(X another)
{
return _InterlockedExchange( ??? );
}
Я вижу два возможных решения
- Используйте
_InterlockedExchange8
- Приведите
another
к длинному, сделайте обмен и приведите результат обратно к X
Первое, очевидно, плохое решение. Второй выглядит лучше, но как его реализовать?
обновление 2
Что вы думаете о чем-то подобном?
template <typename T, typename U>
class padded_variable
{
public:
padded_variable(T v): var(v) {}
padded_variable(U v): var(*static_cast<T*>(static_cast<void*>(&v))) {}
U& cast()
{
return *static_cast<U*>(static_cast<void*>(&var));
}
T& get()
{
return var;
}
private:
T var;
char padding[sizeof(U) - sizeof(T)];
};
struct X
{
char data;
};
template <typename T, int S = sizeof(T)> class var;
template <typename T> class var<T, 1>
{
public:
var(): data(T()) {}
T atomic_exchange(T another)
{
padded_variable<T, long> xch(another);
padded_variable<T, long> res(_InterlockedExchange(&data.cast(), xch.cast()));
return res.get();
}
private:
padded_variable<T, long> data;
};
Спасибо.
did your boss come to you and say "you need to do an atomic RMW operation on a variable"
. Да, моя задача — реализовать класс, который ведет себя именно так. Это именно та проблема, которую нужно решить, здесь ничего нельзя изменить. Предположим, у меня есть функция swap, которая должна атомарно поменять внутреннюю переменную на другую и вернуть старую. Это класс шаблона, аргумент шаблона может быть int, short, long или какой-либо структурой POD с размером меньше, чем sizeof(long), в противном случае он не реализован. - person ledokol   schedule 22.02.2011