(Uwaga: już zadałem to pytanie, ale odpowiedź była specyficzna dla Javy, więc zadaję to samo pytanie dla C# i platformy .NET, NIE jest to duplikat.)Czy nieresetowalne są "bezpieczne" wątki w C#/.NET?
Używam ten schemat przez jakiś czas, ale dopiero niedawno pomyślałem, że może to nie być w porządku, aby to zrobić. Zasadniczo używam jakiś wariant tego wzoru:
public class SampleAsync
{
public SampleAsync() { }
private bool completed;
public void Start()
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, e) => {
//... do something on a different thread
completed = true;
};
worker.RunWorkerAsync();
}
public void Update()
{
if (!completed) return;
//... do something else
}
}
* Użytkownik jest odpowiedzialny za upewnienie Start
nazywa się tylko raz. Update
jest nazywany zawsze i wszędzie.
Zawsze zakładałem, że jest bezpieczny dla wątków w strukturze C#/.NET, ponieważ nawet jeśli nic nie jest ściśle zsynchronizowane, ustawiam tylko completed
na true. Po zaobserwowaniu, że jest to true
, nie zostanie zresetowany do false
. Jest on inicjalizowany na false w konstruktorze, który jest z definicji bezpieczny w wątku (chyba, że zrobisz coś głupiego w nim). Czy w ten sposób można bezpiecznie używać flag nieresetowalnych? (A jeśli tak, to nawet dostarczyć żadnych korzyści wydajności?)
Dzięki
Potrzebujesz 'lotny'. – SLaks
W języku C# i Java? Czy inaczej jest wątkowo bezpieczny? – aboveyou00
"Kiedy zostanie zaobserwowane, że jest prawdziwe" jest to fragment, który może nigdy nie wystąpić, jeśli nie użyjesz 'volatile'. –