Можно ли читать общий логический флаг, не блокируя его, когда другой поток может установить его (не более одного раза)?

Я хотел бы, чтобы мой поток завершился более изящно, поэтому я пытаюсь реализовать простой механизм сигнализации. Я не думаю, что мне нужен поток, полностью управляемый событиями, поэтому у меня есть работник с методом, чтобы изящно остановить его с помощью критического разделаMonitor (эквивалентно C #lock Я верю):

DrawingThread.h

class DrawingThread {
    bool stopRequested;
    Runtime::Monitor CSMonitor;
    CPInfo *pPInfo;
    //More..
}

DrawingThread.cpp

void DrawingThread::Run() {
    if (!stopRequested)
        //Time consuming call#1
    if (!stopRequested) {
        CSMonitor.Enter();
        pPInfo = new CPInfo(/**/);
        //Not time consuming but pPInfo must either be null or constructed. 
        CSMonitor.Exit();
    }
    if (!stopRequested) {
        pPInfo->foobar(/**/);//Time consuming and can be signalled
    }
    if (!stopRequested) {
        //One more optional but time consuming call.
    }
}


void DrawingThread::RequestStop() {
    CSMonitor.Enter();
    stopRequested = true;
    if (pPInfo) pPInfo->RequestStop();
    CSMonitor.Exit();
}

Я понимаю (по крайней мере в винде)Monitor/lockЭто наименее дорогой примитив синхронизации потоков, но я стараюсь избегать его чрезмерного использования. Должен ли я обернуть каждое чтение этого логического флага? Инициализируется как false и устанавливается только один раз, когда истина запрашивается остановка (если она запрашивается до завершения задачи).

Мои репетиторы посоветовали защитить дажеboolпотому что чтение / запись не могут быть атомарными. Я думаю, что этот флаг с одним выстрелом является исключением, которое подтверждает правило?

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

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