Я планирую на написание многопоточного участия в моей игре-проекте:Требуется ли для этого кода синхронизация?
Темы A: загружает кучу объектов с диска, который занимает до нескольких секунд. Каждый загруженный объект увеличивает счетчик.
Thread B: игровой цикл, в котором я либо показываю экран загрузки с количеством загруженных объектов, либо начинаю манипулировать объектами после завершения загрузки.
В коде я считаю, что это будет выглядеть следующим образом:
Counter = 0;
Objects;
THREAD A:
for (i = 0; i < ObjectsToLoad; ++i) {
Objects.push(LoadObject());
++Counter;
}
return;
THREAD B:
...
while (true) {
...
C = Counter;
if (C < ObjectsToLoad)
RenderLoadscreen(C);
else
WorkWithObjects(Objects)
...
}
...
Технически, это может быть расценено как условие гонки - объект может быть загружен, но счетчик еще не увеличивается на единицу, так B считывает старое значение. Мне также нужно кэшировать счетчик в B, поэтому его значение не изменится между проверкой и рендерингом.
Теперь вопрос в том, должен ли я реализовать любую механику синхронизации здесь, например, сделать счетчик атома или ввести какую-либо мьютекс или условную переменную? Дело здесь в том, что я могу спокойно жертвовать итерацией цикла до тех пор, пока счетчик не изменится. И из того, что я получаю, до тех пор, пока A записывает только значение, и B проверяет его, все в порядке.
Я обсуждал этот вопрос с другом, но мы не могли договориться, поэтому мы решили попросить мнение кого-то, более компетентного в многопоточности. Язык - это C++, если это помогает.
Вы также должны учитывать видимость/кеширование памяти. – 1000ml