Блокировка обмена структурой - PullRequest
6 голосов
/ 24 мая 2011

Я хочу использовать InterlockedExchange из WinAPI, чтобы использовать синхронизацию потоков без блокировки.
На данный момент у меня есть такой класс.

struct DataExchange
{
    volatile LONG m_value;
    void SetValue(LONG newVal)
    {
        InterlockedExchange(&m_value, newVal);
    }

    LONG GetValue()
    {
        LONG workVal=0;
        InterlockedExchange(&workVal, m_value);
        return workVal;
    }
};

Один поток может установить новое значение идругой поток может прочитать это значение.
Теперь я хочу изменить значение LONG на struct.Есть ли способ в WinAPI, как я могу бесплатно скопировать struct блокировку?

Ответы [ 4 ]

3 голосов
/ 24 мая 2011

Нет, если вы не можете уместить вашу структуру в 32 бита, в этом случае вы можете продолжать использовать InterlockedExchange.

1 голос
/ 24 мая 2011

Вы можете получить элементарную операцию для 64-разрядного значения, используя InterlockedExchange64 на 64-разрядных платформах и Windows Vista / 7.Этого было бы достаточно для размещения двух 32-битных int значений в структуре.

Поскольку функция реализована с использованием экземпляра complier, она в основном вызывает зависимую от платформы инструкцию сборки, такую ​​как CMPXCHG в x86.Так как эта инструкция работает только на максимуме (на 64-битных платформах) для операнда-источника 64-битного регистра, 64-битного регистра или операнда-приемника памяти и регистра RAX, существует только значение определенного размера, которое выможет выполнить элементарную операцию с использованием отдельных инструкций по сборке без включения какого-либо типа блокировки или семафора для создания критической секции.

1 голос
/ 24 мая 2011

Лучшее, что вы можете сделать, - это использовать InitializeCriticalSectionAndSpinCount функцию, которая не будет ожидать блокировки, если можно достаточно быстро вступить во владение.

1 голос
/ 24 мая 2011

Только если структура ровно 32 бита.

Альтернативой является использование InterlockedExchange для указателя на структуру. Структура должна быть неизменной (или никогда не менять ее). Чтобы обновить структуру, создайте новую, а затем замените указатель. Вы должны быть осторожны с уничтожением структуры, чтобы убедиться, что это делается только один раз, и только если никто не использует ее.

...