Считается ли незащищенное чтение из общей памяти гонкой данных и неопределенным поведением?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Считается ли незащищенное чтение из общей памяти гонкой данных и неопределенным поведением?

Сообщение Anonymous »

Согласно этому ответу и соответствующим цитатам из стандарта:

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

Этот тривиальный пример:

Код: Выделить всё

bool flag = false;

int main() {
auto fut = std::async(std::launch::async, []() {
while (!flag) {
std::cout flag) {
std::cout flag = true;
return 0;
}
Я понимаю, что не имеет значения, где в памяти выделен флаг, и мой пример по-прежнему имеет неопределенное поведение (Helgrind обнаруживает гонку данных), и я могу ожидать какая-нибудь будущая версия GCC, чтобы провести неприятную оптимизацию и сломать мою систему.
Теперь, что касается модульных тестов, где я устанавливаю условие остановки из того же процесса, в котором работает моя система, я могу пройти это можно обойти, явно используя мьютекс:

Код: Выделить всё

int main() {
SharedMemHelper memHelper;
std::mutex m;
auto fut = std::async(std::launch::async, [&]() {
while (true) {
{
std::lock_guard l{m};
if (memHelper.getData()->flag) {
break;
}
}
std::cout flag = true;
}
return 0;
}
однако создается впечатление, что эта модификация не имеет смысла с точки зрения производственного кода, поскольку предполагается, что условие остановки исходит от другого процесса.
Но, с точки зрения языка C++, уже ли введение блокировки чтения общей памяти спасает меня от неопределенного поведения и, следовательно, не позволяет компилятору делать вредные (для моей системы) предположения?
Предположим, что я не могу изменить код, отвечающий за IPC (

Код: Выделить всё

SharedMemHelper
в этом примере), что еще я могу изменить в рабочем коде, чтобы избежать неопределенного поведения. Я использую C++17.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -undefined
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»