Учитывая структуру, как это:В какой степени должны использоваться атомарные типы, чтобы гарантировать видимость поперечной резьбы?
struct foo {
atomic_int refcount; /* atomic access */
char* bar1; /* read-only */
char* bar2; /* read-only */
};
Строго говоря: это необходимо использовать atomic_intptr_t
для bar1
и bar2
, чтобы гарантировать видимость кросс-нить из неатомарных переменных, разумеющимся, что я использую надлежащего сбора по/выпуска семантика?
Я до сих пор перевариваю этот ответ, но мне интересно, если пара приобретает/релиз действительно наблюдать новое значение ('RefCount '), будут ли неатомные поля видны и для других потоков? В этом случае я инициализирую 'bar1' и' bar2', а затем опубликую структуру, установив 'refcount' в 1 и разместив его где-нибудь. В принципе, я не могу рисковать другими потоками, видя мусор в неатомных полях. – haste
@haste: Они не будут видеть мусор. Тем не менее, я говорю, что они могут * никогда не видеть новое значение. Стандарт только гарантирует, что * если * вы видите новое значение в паре приобретения/выпуска, * затем * все эффекты до релиза видны. Но я не вижу никаких гарантий, что «все в конечном итоге распространяется». –
Существует два исключения. Если вы используете RMW, вы получаете более мощную семантику, так как только одно действие RMW может читать из данной записи. Тогда, конечно, последовательно последовательные гарантии, что вы видите последние значения. – briand