Vorrei che il mio thread si spenga più agevolmente, quindi sto cercando di implementare un semplice meccanismo di segnalazione. Non credo che voglio un filo completamente event-driven quindi ho un lavoratore con un metodo per graceully fermarla con una sezione critica Monitor
(equivalente a un C# lock
credo):Va bene leggere un flag booleano condiviso senza bloccarlo quando un altro thread può impostarlo (al massimo una volta)?
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();
}
ho capito (almeno in Windows) Monitor
/lock
s sono i meno costosi sincronizzazione dei thread primitivo ma sono desiderosi di evitare un uso eccessivo. Dovrei essere avvolgente ogni lettura di questa bandiera booleana? Viene inizializzato su false e viene impostato una sola volta su true quando viene richiesto stop (se richiesto prima che l'attività venga completata).
I miei tutor consigliavano di proteggere anche bool
perché la lettura/scrittura potrebbe non essere atomica. Penso che questa bandiera unica sia l'eccezione che conferma la regola?
Consulta i consigli del tuo tutor (probabilmente hanno ragione) - anche se non lo sono, sono quelli che contrassegnano il tuo lavoro, quindi se dicono che è necessario, allora è necessario. – John3136
@ John3136 Il consiglio del mio tutor ha 10 anni, questo è il mio lavoro ora. – John