В теоретическом плане да. Если вам удастся как-то заставить два потока работать в режиме блокировки, как это
time thread A thread B
---- -------- --------
|| CAS
|| atomic_write
|| CAS
\/ atomic_write
Тогда CAS никогда не вернет true.
На практике это никогда не произойдет, когда потоки совместно используют процессор / ядро, и вряд ли произойдет, когда потоки работают на разных процессорах или ядрах. На практике это невероятно вряд ли произойдет больше чем за несколько циклов, и астрономически вряд ли произойдет больше, чем квант планировщика.
А вот если этот код
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
делает то, что, по-видимому, делает, то есть извлекает текущее значение test
и сравнивает его с test
, чтобы увидеть, изменилось ли оно. В реальном мире итерации CAS будут разделяться кодом, который выполняет реальную работу. Ключевое слово volatile
понадобится, чтобы убедиться, что компилятор извлек тест перед вызовом CAS, а не предполагать, что копия, которую он все еще имеет в реестре, все еще будет действительной.
Или значение, с которым вы будете тестировать, будет не текущим значением теста, а скорее чем-то вроде последнего известного значения.
Другими словами, этот пример кода является проверкой теории, но вы не будете использовать CAS, подобный этому, на практике, поэтому даже если вы можете заставить это потерпеть неудачу, он не обязательно скажет вам, как это могло бы произойти при использовании в реальных алгоритмах.