Неправильное использование InterlockedCompareExchange для атомарного копирования значения?

Я не могу использовать атомарность C++11 здесь

У меня есть сомнения по поводу моего использования InterlockedCompareExchange() чтобы "атомарно" прочитать переменную.

Я задал вопрос об этом здесь, но то, что я делал там, было другим. Параметры "exchange" и "comperand" (2-й и 3-й) были "жестко закодированными" значениями, т.е. не считывались из переменной.

Пожалуйста, учтите это:

    // Copy the connect time
    DWORD dwConnectTime = InterlockedCompareExchange(&msgInfo.m_dwConnectTime, 
                            msgInfo.m_dwConnectTime, 
                            msgInfo.m_dwConnectTime);

Это предназначено для обмена значения msgInfo.m_dwConnectTime с текущим значением msgInfo.m_dwConnectTimeпри условии текущей стоимости msgInfo.m_dwConnectTime является msgInfo.m_dwConnectTime, Предыдущее значение msgInfo.m_dwConnectTime затем возвращается, на что я полагаюсь, чтобы "скопировать" значение.

Это только что дошло до меня, хотя, что читает msgInfo.m_dwConnectTime для второго и третьего параметров не гарантируется, что они будут атомарными. Таким образом, этот код неверен, поэтому мне нужно использовать блокирующий примитив для копирования msgInfo.m_dwConnectTime?

1 ответ

Решение

Основываясь на комментариях и ссылке на ваш предыдущий вопрос, этот вопрос мотивирован вашим желанием избежать слез. Чтение и запись в выровненные данные являются атомарными. Вы пытаетесь защититься от разрывов, но разрыв данных невозможен, когда данные выровнены. И разумно предположить, что ваши данные выровнены, потому что это требование InterlockedCompareExchange и действительно все InterlockedXXX функции.

Таким образом, вопрос, который вы задаете, не является чем-то вроде sequitur. Это основано на ложной предпосылке, что разрыв может произойти с согласованными данными.

Итак, вам не нужно звонить InterlockedCompareExchange или любой другой InterlockedXXX функция во избежание разрыва, потому что разрыв возможен только тогда, когда данные не выровнены.

Другие вопросы по тегам