Выполнение программы содержит гонку данных, если она содержит два потенциально одновременных конфликтующих действия. , по крайней мере один из которых не является атомарным, и ни один из них не происходит раньше другого, за исключением особого случая для обработчиков сигналов, описанного ниже. Любая такая гонка данных приводит к неопределенному поведению.
Этот тривиальный пример:
Код: Выделить всё
bool flag = false;
int main() {
auto fut = std::async(std::launch::async, []() {
while (!flag) {
std::cout flag) {
std::cout flag = true;
return 0;
}
Теперь, что касается модульных тестов, где я устанавливаю условие остановки из того же процесса, в котором работает моя система, я могу пройти это можно обойти, явно используя мьютекс:
Код: Выделить всё
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
Подробнее здесь: https://stackoverflow.com/questions/787 ... -undefined