Можно ли читать общий логический флаг, не блокируя его, когда другой поток может установить его (не более одного раза)?
Я хотел бы, чтобы мой поток завершился более изящно, поэтому я пытаюсь реализовать простой механизм сигнализации. Я не думаю, что мне нужен поток, полностью управляемый событиями, поэтому у меня есть работник с методом, чтобы изящно остановить его с помощью критического раздела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
потому что чтение / запись не могут быть атомарными. Я думаю, что этот флаг с одним выстрелом является исключением, которое подтверждает правило?