Неправильное использование InterlockedCompareExchange для атомарного копирования значения? - PullRequest
0 голосов
/ 01 мая 2018

Я не могу использовать атомы 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 Ответ

0 голосов
/ 01 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...