Создание нового ответа, потому что ваши изменения немного изменили:
- Использовать _InterlockedExchange8
- Примените еще одну к длинной, обменяйте и приведите результат обратно к X
Первый просто не сработает. Даже если функция существует, она позволит вам атомарно обновлять байт за раз. Это означает, что объект в целом будет обновлен в серии шагов, которые не будут атомарными.
Второй также не работает, если X
не имеет тип POD long
. (и если он не выровнен по границе sizeof(long)
, и если он не того же размера, что и long
)
Чтобы решить эту проблему, вам нужно сузить типы X
. Во-первых, конечно, гарантированно будет тип POD? Если нет, то у вас совершенно другая проблема, поскольку вы не можете безопасно обрабатывать не POD-типы как необработанные байты памяти.
Во-вторых, какие размеры могут иметь X
? Блокированные функции могут обрабатывать 16, 32 и, в зависимости от обстоятельств, могут быть шириной 64 или даже 128 бит.
Охватывает ли это все случаи, с которыми вы можете столкнуться?
Если нет, возможно, вам придется отказаться от этих атомарных операций и согласиться на простые старые блокировки. Заблокируйте Mutex, чтобы гарантировать, что только один поток касается этих объектов одновременно.