2016-12-03 5 views
0

Это A. Williams C++ Параллельность в книге действий, блокировка стека с указателем опасности. Предположим, что я получить представление о ней, всего за две линии, за исключением, здесь они имеют вид (source здесь):Атомность IF и следующее утверждение

// code before 
if (old_head) { 
res.swap(old_head->data); 
// code after 

Вопрос: можно удалить другой поток (изменение и т.д.) «old_head» указатель перед его разыменованные (old_head-> данные)? Логика не говорит о том, что весь код Уильямса ошибочен, но я сомневаюсь, что это своего рода атомная операция. Как вы думаете?

+1

http://preshing.com/20120612/an-introduction-to-lock-free-programming/ –

ответ

3

Если old_head доступен для нескольких потоков, а кодовый блок не защищен каким-либо механизмом синхронизации, тогда да old_head может быть изменен между проверкой и разыменованием. if заявление само по себе не гарантирует атомарности.