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