class StopIt
{
private bool stop;
void Loop()
{
while (!stop)
{
// work
}
}
void Stop()
{
stop = true;
}
}
In pratica, se il metodo Loop è in esecuzione in un thread e Stop viene chiamato da un altro, l'operazione si interrompe correttamente? Capisco che bool leggere/scrivere sia atomico. Ma è abbastanza? Se il ciclo del filo non viene fermato immediatamente, c'è un problema. Dovrei contrassegnare l'arresto volatile?È un'operazione atomica sufficiente
La mia regola: se non si conosce ESATTAMENTE cosa significa volatile, non si dovrebbe tentare di scrivere programmi senza blocco. Dal momento che stai facendo la domanda, non sai cosa significa. Quindi non tentare di scrivere un programma lock-free. Stai attento. Usa un lucchetto. Le serrature sono costose solo se contese; non provare a renderlo bloccato fino a quando non sei sicuro che (1) hai un problema di prestazioni (2) il blocco è la causa del problema e (3) capisci cosa significa volatile fino al livello dell'hardware del processore. –
Non dovrei usare il blocco quando si accede allo stop? Se è così, allora come posso bloccare l'accesso in lettura nel ciclo while? –
@yummy: è difficile bloccare la lettura come sembra ora, dal momento che accedi al campo direttamente nel tuo ciclo while. Se incapsuli quello letto in una proprietà (o in un metodo), puoi usare un lucchetto per leggere il valore. –