2016-04-17 2 views
2

В стандарте C11 и C++ 11 появляется оператор потенциально разделяемая память.. Что это значит? Все глобальные переменные потенциально могут использоваться в многопоточной среде?Что такое потенциально разделяемая память?

+0

Я ожидаю, что это решится на реализацию. Все будет потенциально разделяться, если реализация не сможет доказать, что этого не может быть. –

+0

В C++ 14 единственной фразой, которая выглядит аналогично, является «потенциально разделяемая память». Он появляется дважды, как в ненормативных заметках в ** [intro.multithread] **. Это, по-видимому, означает «место памяти, для которого оптимизатор не может исключать возможность доступа к нему других потоков», поскольку в заметках обсуждается законность определенных оптимизаций. –

+0

@Igor Tandetnik Вопрос исправлен, спасибо. – mrn

ответ

2

Не очень знакомы со стандартом C. В C++ 14, фраза "потенциально общей ячейке памяти" появляется дважды, в двух ненормативных нот:

[intro.multithread]/25 [Примечание: Compiler преобразования, вводящие присвоений потенциально разделяемая ячейка памяти, которая не будет изменена абстрактной машиной, обычно исключается этим стандартом, поскольку такое назначение может перезаписывать другое назначение другим потоком в случаях, когда выполнение абстрактной машины не было бы связано с расходом данных , Это включает в себя реализацию назначения элементов данных, которые перезаписывают соседние элементы в отдельных ячейках памяти. Переупорядочение атомных нагрузок в случаях, когда атомы, о которых идет речь, может быть псевдонимом, также обычно исключается, поскольку это может нарушать правила согласованности. - конец примечание]

[intro.multithread]/26 [Примечание: Трансформации, вводящие спекулятивный читал о потенциально разделяемой области памяти не может сохранить семантику программы C++, как это определено в этот стандарт, поскольку они потенциально представляют собой гонку данных. Однако они, как правило, действительны в контексте оптимизирующего компилятора, который нацелен на конкретную машину с четко определенной семантикой для расчётов данных. Они были бы недействительны для гипотетической машины, которая не терпима к гонкам или обеспечивает обнаружение аппаратной гонки. - конца примечание]

Из контекста, это довольно ясно, что «потенциально разделяет ячейка памяти» должна означать «ячейку памяти, для которых оптимизатор не может исключить возможность того, что другие потоки могут получить доступ, и поэтому следует исходить из пессимистического предположения, что они могут ". Затем в двух примечаниях обсуждается законность определенных оптимизаций, которые могут быть или не могут быть сделаны при таком предположении.

Re: глобальные переменные. Да, глобальная переменная обычно доступна для произвольных потоков. В принципе, возможно, что сложный оптимизатор, выполняющий всю оптимизацию программы, может доказать, что к какой-либо конкретной глобальной переменной не обращаются одновременно от нескольких потоков (я не знаю о каких-либо реальных компиляторах, которые в настоящее время способны достичь такого feat, но тогда я бы не стал называть себя экспертом по компилятору любым растяжением). Запрет на то, что ячейки памяти, занятые глобальной переменной, должны обрабатываться оптимизатором как потенциально разделяемые.