Изменить.Редактирование вопроса означает, что большая часть этого не имеет значения.Тем не менее, я оставлю это, поскольку все проблемы в случае C # также относятся к случаю C ++, но случай C ++ приносит намного больше проблем, как указано, так что это не совсем не имеет значения.
Да,но ...
Предполагая, что вы имеете в виду, что этот CAS является атомарным (что имеет место в C # Interlocked.CompareExchange
и с некоторыми вещами, доступными для использования в некоторых библиотеках C ++), он сам по себе потокобезопасен.
Однако DestVar = Value
может быть поточно-безопасным и сам по себе (это будет в C #, независимо от того, находится он в C ++ или нет, зависит от реализации).
В C # запись вцелое число гарантированно будет атомарным.Таким образом, выполнение DestVar = Value
не приведет к ошибке из-за того, что что-то происходит в другом потоке.Это «потокобезопасный».
В C ++ таких гарантий нет, но есть некоторые процессоры (на самом деле, давайте сейчас просто отбросим C ++, достаточно сложность, когда речь идет о более сильных гарантиях C #).и C ++ имеет все эти сложности и даже больше, когда речь идет о подобных проблемах).
Теперь использование атомарных операций CAS само по себе всегда будет «теад-безопасным», но это не то, гдевозникает сложность обеспечения безопасности потоков. Важна безопасность потоков различных комбинаций операций.
В вашем коде в каждом цикле либо значение будет перезаписано атомарно, либо нет.В случае, если этого не произойдет, он попробует снова и продолжит, пока не сделает.Это может закончиться вращением на некоторое время, но в конечном итоге это сработает.
И при этом это будет иметь тот же эффект, что и простое назначение - включая возможность возиться с тем, что происходит в другом потоке, и вызватьсерьезная ошибка, связанная с потоком.
Для сравнения посмотрите на ответ на вопрос Является ли использование статической очереди потокобезопасным? и объяснение того, как он работает.Обратите внимание, что в каждом случае CAS допускается сбой, потому что его сбой означает, что другой поток сделал что-то «полезное», или когда он проверен на успех, выполняется больше, чем просто остановка цикла.Это комбинации CAS, каждый из которых обращает внимание на возможное состояние, вызванное другими операциями, которые позволяют безблокировочный код без ожидания, который является потокобезопасным.
И теперь мы закончили с этим, отметим также, чтоВы не можете перенести это непосредственно на C ++ (сбор мусора зависит от того, чтобы некоторые возможные сценарии ABA не имели большого значения, с C ++ бывают ситуации, когда могут возникнуть утечки памяти).Это также имеет значение, на каком языке вы говорите.