Неправильное использование 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
функция во избежание разрыва, потому что разрыв возможен только тогда, когда данные не выровнены.