2015-01-09 2 views
4

Довольно общий вопрос: Как бы вы объявили переменную в C++, которая будет использоваться для разных потоков? (или что-то вроде ..). Я думал, что «volatile int x;» это ответ, но из некоторых комментариев я вижу, что это неверно. Я заинтересован в обоих:Объявление переменной, разделяемой между потоками

  • что правильный ответ
  • почему летучий считалось правильным в прошлом, но не сейчас ..
+2

'volatile' не был прав в любое время. –

+0

Это зависит от требований программного обеспечения, но вы можете создать атомную переменную или, в зависимости от самих данных (и использования), защитить ее с помощью мьютекса. – Raistmaj

ответ

5

, что это (?) правильный ответ

std::atomic<int> x; 

почему летучий был хотя t, если быть точным (?) в прошлом, но не сейчас

Это никогда не было правильным в соответствии со стандартом C++. До C++ 11 стандарт вообще не упоминал о потоках; Поддерживаемая синхронизация C++ 11 путем добавления атомных типов (и примитивов, таких как std::mutex), а не путем изменения значения volatile или других существующих функций языка.

Один популярный компилятор решил, что volatile должен обеспечивать синхронизацию доступа по потокам, а также его стандартное значение. Другие компиляторы не предоставляют это расширение, поэтому это не то, на что можно надежно использовать.

+3

Какой был компилятор? – 2501

+1

@ 2501: Visual C++. –

0

volatile никогда не был правильным ответом на этот вопрос. Ключевое слово volatile дает указание компилятору, что переменная может меняться между использованием. Поэтому, хотя многопоточное приложение может это сделать, так могут возникать и другие ситуации, такие как сопоставленные порты переменные на микроконтроллере.

Важно, что компилятор не защищал доступ к переменной, а просто избегал любых оптимизаций, предполагавших, что переменная остается неизменной между обращениями.

Для ваших целей std::atomic<Type> - это гораздо лучший ответ, хотя, вероятно, лучше в условиях интервью понять, что важным фактором является то, что межпоточный доступ контролируется защитой блокировки, предотвращая одновременное чтение/запись или запись/запись доступ через разные потоки.