Безопасно ли использовать volatile bool, чтобы заставить другой поток ждать? (C ++)

Все я'Я читал о летучих, говорит этоникогда не бывает в безопасности, но я все еще чувствую склонность попробовать это, и у меня нетЯ видел этот конкретный сценарий, объявленный небезопасным.

У меня есть отдельный поток, который отображает сцену, извлекая данные из основного потока моделирования. Это не имеет синхронизации и работает нормально.

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

Для этого у меня есть рендер, который бесконечно работает в своей ветке:

volatile bool stillRendering;

void RenderThreadFunction()
{
    stillRendering = true;

    while(programRunning)
    {
        renderer->render();
    }

    stillRendering = false;
}

В главном потоке программы, когда получено сообщение о выходе windproc, я делаю:

void OnQuit()
{
    programRunning = false;
    while(stillRendering)
    {
    }

    delete application;
}

Цель этого состоит в том, чтобы убедиться, что средство рендеринга прекращает извлекать данные из приложения перед вызовом удаления в приложении.

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

Добавление volatile к just stillRendering приводило к успешному завершению работы приложения каждый раз, когда я 'мы проверили это до сих пор. Я'Я не уверен, почему это не такне имеет значения, еслиprogramRunning» является летучим

Наконец, я не уверен, как повлияет на производительность программы использование volatile для "stillRendering», Это неДля меня не имеет значения, влияет ли создание stillRendering volatile на производительность OnQuit (), но для меня имеет значение, влияет ли это на производительность RenderThreadFunction ()

Ответы на вопрос(5)

Ваш ответ на вопрос