(Примечание: Я уже задавал этот вопрос, но ответ был специфичным для Java, поэтому я задаю тот же вопрос для C# и .NET framework. Это не дубликат.)Неустранимые «флаги» потокобезопасны в C# /. NET?
Я использую этот шаблон на некоторое время, но я только недавно пришел к мысли, что, возможно, не все в порядке. В основном, я использую некий вариант этой модели:
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
}
}
* Пользователь несет ответственность за то, чтобы Start
вызывалась только один раз. Update
называется везде и где угодно.
Я всегда предполагал, что это потокобезопасно в C#/.NET framework, потому что, хотя ничто не строго синхронизировано, я только установил completed
в true. Как только будет наблюдаться true
, он не будет сброшен до false
. Он инициализируется значением false в конструкторе, который по определению является потокобезопасным (если вы не делаете в нем что-то глупое). Таким образом, безопасно ли использовать потоки с помощью несанкционированных флагов? (И если да, то это даже дает никаких преимуществ производительности?)
Благодарности
Вам нужно 'volatile'. – SLaks
В C#, а также Java? Это потокобезопасность в противном случае? – aboveyou00
«Как только было замечено, что это правда» - это бит, который никогда не может произойти, если вы не используете 'volatile'. –