Должны ли Я блокирую переменную в одном потоке, если мне нужно только ее значение в других потоках, и почему она работает, если я этого не сделаю?

Я знаю этот вопрос , но считаю, что мои опасения совсем другие.

Недавно я создал приложение SDL, используя многопоточность и OpenGL. У меня есть один поток, работающий в цикле, который постоянно обновляет состояние объектов, которые я рисую на экране. Состояния очень просты, это просто логический массив (когда значение массива истинно, я рисую его, когда ложно - нет).

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

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

  • Это просто случайность или есть причина, по которой не происходит нарушений доступа к памяти?
  • Если допустимо изменение состояния переменной непосредственно перед, во время или сразу после использования значения, стоит ли мне беспокоиться об использовании блокировки мьютекса?

Спасибо за вашу помощь.


Изменить: Дополнительная информация - массив создается динамически, но когда он создается / удаляется, я использую мьютекс (я решил получить доступ к удаленной памяти не будет снисходительно: P).

5
задан Community 23 May 2017 в 11:51
поделиться