Подробен отговор на внедряването:
Докато езиковият стандарт класифицира това като недефинирано поведение, всъщност можете да се чувствате доста сигурни, стига наистина да пишете едни и същи данни.
Защо? Хардуерът последователно осъществява достъпа до една и съща клетка от паметта. Единственото нещо, което може да се обърка е, когато няколко клетки от паметта се записват едновременно, защото тогава нямате гаранция от хардуера, че достъпите до няколко клетки са последователни по един и същи начин. Например, ако един процес запише 0x0000000000000000
, а друг запише 0xffffffffffffffff
, вашият хардуер може да реши да последователно подреди достъпите до различните байтове по различен начин, което води до нещо като 0x00000000ffffffff
.
Ако обаче данните, записани от двата процеса, са еднакви, тогава няма забележима разлика между двете възможни сериализации, резултатът е детерминистичен.
Съвременният хардуер не обработва достъп до паметта по байт по байт начин, вместо това процесорите комуникират с основната памет по отношение на кеш линии, а ядрата обикновено могат да комуникират с техните кешове по отношение на 8-байтови думи. Като такова, настройването на правилно подравнен указател е атомарна операция, на която може да се разчита за прилагане на алгоритми без блокиране. Това е използвано в ядрото на Linux, преди да станат достъпни по-мощни атомарни операции. C++ формализира това под формата на atomic<>
типове, добавяйки поддръжка за хардуерни функции на по-високо ниво като запис след четене, атомни увеличения и други.
Но, разбира се, ако разчитате на вашите хардуерни детайли, наистина трябва да знаете какво правите, преди да го направите. В противен случай се придържайте към езикови функции като типовете atomic<>
, за да осигурите правилни операции и да избегнете UB.
@Downvoters:
Въпросът не е маркиран [language-lawyer] и отговорът изрично посочва „подробен отговор за внедряване“. Целта беше да се обясни как ще изглежда UB в програмата в реалния живот. Този отговор е написан, за да допълни приетия отговор (който има моето одобрение) с различна гледна точка към въпроса.
person
cmaster - reinstate monica
schedule
13.04.2014