Учитывая описанные вами предположения, нет никакой гарантии, что запись переменной volatile
в одном потоке будет «видна» в другом.
Учитывая это, ваш второй вопрос (о сроках) не применим.
В (многопроцессорных) архитектурах PowerPC когерентность кэша недостаточна для обеспечения видимости volatile
переменной между ядрами. Существуют явные инструкции, которые необходимо выполнить, чтобы гарантировать сброс состояния (и сделать его видимым для нескольких процессоров и их кешей).
На практике на архитектурах, которые требуют выполнения таких инструкций, реализация примитивов синхронизации данных (мьютексы, семафоры, критические секции и т. Д.), Помимо прочего, использует эти инструкции.
В более широком смысле ключевое слово volatile
в C ++ вообще не имеет ничего общего с многопоточностью, не говоря уже о когерентности между кешами. volatile
в данном потоке выполнения означает необходимость в таких вещах, как выборка и запись переменной, которая не удаляется или не переупорядочивается компилятором (что влияет на оптимизацию). Это не переводится в какие-либо требования к упорядочиванию или синхронизации завершения выборки или записи между потоками выполнения - и такие требования необходимы для согласованности кеша.
Теоретически может быть реализован компилятор для предоставления таких гарантий. Я еще не видел никакой информации о том, кто это делает - что неудивительно, поскольку предоставление такой гарантии серьезно повлияет на производительность многопоточного кода из-за принудительной синхронизации между потоками - даже если программист не использовал синхронизацию (мьютексы и т. Д.) в их коде.
Точно так же платформа хоста может также условно предоставлять такие гарантии с volatile
переменными - даже если выполняемые инструкции не требуют их специально. Опять же, это приведет к снижению производительности многопоточных программ, включая современные операционные системы, на этих платформах. Это также повлияет (или сведет на нет) преимущества различных функций, которые способствуют производительности современных процессоров, таких как конвейерная обработка, заставляя процессоры ждать друг друга.
Если вы, как разработчик C ++ (в отличие от человека, пишущего код, использующий определенные функции, предлагаемые вашим конкретным компилятором или платформой хоста), хотите, чтобы переменная, записанная в одном потоке, могла быть когерентно прочитана другим потоком, тогда не беспокойтесь о volatile
. Выполняйте синхронизацию между потоками - когда им требуется одновременный доступ к одной и той же переменной - используя предоставленные методы, такие как мьютексы. И следуйте обычным рекомендациям по использованию этих методов (например, используйте мьютексы экономно и минимизируйте время, которое они удерживаются, сделайте как можно больше в ваших потоках, не обращаясь к переменным, которые используются совместно между потоками вообще).
person
Peter
schedule
23.01.2016
volatile
. - person rici   schedule 30.11.2015volatile
для произвольного типа? Или конкретный? Возможно, эта ссылка может предоставить дополнительную информацию: en.cppreference.com/w/cpp/language / cv (это не ответ, но я подумал, что может быть интересно узнать). - person Ely   schedule 30.11.2015volatile
не дает таких гарантий. Стандарты C и C ++ ясно говорят, что только атомарные операции дают такие гарантии (которые являются специальными операциями, которые включают любые необходимые барьеры памяти ... использование атомарных операций здесь не означает только частичное чтение / запись! ). См. Ссылки внизу страницы cxx.isvolatileusefulwiththreads.com для получения более подробной информации. - person Jonathan Wakely   schedule 02.12.2015const_cast<volatile storage_type &>(v_) = v;
- person Hanno S.   schedule 02.12.2015