Изменчивые переменные в C 11
Введение многопоточной модели машины в стандарте C 11 поднимает вопросы о поведении изменчивых переменных переменные, которые традиционно использовались для предотвращения оптимизации, которая могла привести к неопределенному поведению в параллельных средах.
В C 98/03 отсутствие распознавания многопоточности в модели памяти означало, что компилятор мог оптимизировать из-за чтения изменчивой переменной, что приводит к печально известному примеру бесконечного цикла while, ожидающего, пока переменная изменит свое значение.
Однако модель памяти C 11 признает возможность одновременного доступа к переменным. Означает ли это, что изменчивость больше не рекомендуется?
Оптимизация компилятора и неопределенное поведение
Ответ кроется в нюансах модели памяти C 11. Хотя он распознает многопоточность, он не исключает возможности неопределенного поведения при доступе к переменным без надлежащей синхронизации. Даже в многопоточной среде неатомарный доступ к общим переменным остается неопределенным.
Летучий int x;
void func() {
x = 0;
while (x = = 0) {}
}
Поэтому в нашем примере кода компилятор по-прежнему может оптимизировать чтение x в цикле while, что приводит к неопределенному поведению. Изменчивость влияет только на доступ к памяти, но не на поведение потоков.
Барьеры памяти и целостность потоков
Целостность потоков требует наличия надлежащих механизмов синхронизации, обеспечивающих видимость операций записи в одном потоке для другого . Модель памяти C11 конкретно определяет, когда и как записи становятся видимыми для других потоков. Летучий не удовлетворяет этому требованию.
Летучий гарантирует, что компилятор не сможет оптимизировать чтение памяти из переменной, но не дает никаких гарантий относительно видимости потока. Барьеры памяти, создаваемые конструкциями синхронизации, такими как блокировки или атомарные операции, необходимы для обеспечения синхронизации записи между ядрами. для предотвращения оптимизаций, которые могут привести к некорректному доступу к памяти. Однако этого недостаточно для многопоточного программирования. Надлежащие механизмы синхронизации по-прежнему необходимы для обеспечения целостности потоков и определенного поведения в параллельных средах.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3