Худшее, что случится, зависит от реализации.Существует так много полностью независимых реализаций pthreads, работающих на разных системах и оборудовании, что я сомневаюсь, что кто-нибудь знает обо всех них все.
Если p
не является указателем на изменчивый, то я думаю,что компилятор для соответствующей реализации Posix разрешил превращаться:
while (*p == 0) {}
exit(0);
В единственную проверку *p
с последующим бесконечным циклом, который не утруждает себя просмотром значения*p
вообще.На практике это не так, поэтому вопрос заключается в том, хотите ли вы программировать в соответствии со стандартом или программировать на недокументированное наблюдаемое поведение используемых вами реализаций.Последний обычно работает для простых случаев, и затем вы строите код, пока не сделаете что-то достаточно сложное, чтобы оно неожиданно не сработало.
На практике, в многопроцессорной системе, которая не имеет связногоКэши памяти, может пройти очень много времени, прежде чем цикл while увидит изменения, сделанные на другом процессоре, потому что без барьеров памяти он никогда не сможет обновить свое кэшированное представление основной памяти.Но у Intel есть согласованные кэши, поэтому, скорее всего, вы лично не увидите задержек, достаточных для того, чтобы о них заботиться.Если какой-то плохой обманщик попытается запустить ваш код на более экзотической архитектуре, он может в конечном итоге исправить это.
Возвращаясь к теории, описываемая вами установка может вызватьавария.Представьте себе гипотетическую архитектуру, в которой:
p
указывает на неатомарный тип, например long long
в типичной 32-разрядной архитектуре. long long
в этой системе имеетпредставления ловушек, например, потому что у него есть бит дополнения, используемый в качестве проверки четности. - запись в
*p
наполовину завершена, когда чтение происходит - , при полусфере обновлено несколькобитов значения, но еще не обновил бит четности.
Удар, неопределенное поведение, вы читаете представление прерывания.Возможно, что Posix запрещает определенные представления ловушек, которые допускает стандарт C, и в этом случае long long
может быть недопустимым примером для типа *p
, но я ожидаю, что вы можете найти тип, для которого разрешены представления ловушек.