Вот такая странная идея. Я не знаю точно, как у вас настроена структура данных. Но если это возможно, вы могли бы сохранить ваши два int
значения в long
, тогда я думаю, вы могли бы поменять их местами атомно.
Например, допустим, вы обернули два значения следующим образом:
class SwappablePair
{
long m_pair;
public SwappablePair(int x, int y)
{
m_pair = ((long)x << 32) | (uint)y;
}
/// <summary>
/// Reads the values of X and Y atomically.
/// </summary>
public void GetValues(out int x, out int y)
{
long current = Interlocked.Read(ref m_pair);
x = (int)(current >> 32);
y = (int)(current & 0xffffffff);
}
/// <summary>
/// Sets the values of X and Y atomically.
/// </summary>
public void SetValues(int x, int y)
{
// If you wanted, you could also take the return value here
// and set two out int parameters to indicate what the previous
// values were.
Interlocked.Exchange(ref m_pair, ((long)x << 32) | (uint)y);
}
}
Тогда кажется, что вы могли бы добавить следующий метод Swap
, чтобы получить "атомно" переставленную пару (на самом деле, я не знаю, действительно ли справедливо сказать, что следующее является атомарным; это больше похоже на то, что дает тот же результат, что и атомный своп ).
/// <summary>
/// Swaps the values of X and Y atomically.
/// </summary>
public void Swap()
{
long orig, swapped;
do
{
orig = Interlocked.Read(ref m_pair);
swapped = orig << 32 | (uint)(orig >> 32);
} while (Interlocked.CompareExchange(ref m_pair, swapped, orig) != orig);
}
Вполне возможно, что я это неправильно реализовал, конечно. И в этой идее может быть недостаток. Это просто идея.