Ответ 1
Разумеется, то, о чем ответили SLaks, конечно, но чтобы ответить на ваш вопрос: да по обоим пунктам: безопасно, он должен быть объявлен изменчивым.
Мне интересно, полностью ли это потокобезопасно, и должно ли ключевое слово volatile быть на месте.
using System.Threading;
class Program
{
private static volatile bool _restart = true;
private static void Main()
{
while (_restart)
{
// Do stuff here every time for as long as _restart is true
Thread.Sleep(1);
}
}
private static void SomeOtherThread()
{
Thread.Sleep(1000);
_restart = false;
}
}
Я думаю, что это так, но я хочу дважды проверить, так как я не на 100% уверен, что я просто хочу быть уверенным.
Я думаю, что ключевое слово volatile требуется, потому что тогда никогда не будет возможно кэшировать значение в регистре или аналогичные оптимизации.
Разумеется, то, о чем ответили SLaks, конечно, но чтобы ответить на ваш вопрос: да по обоим пунктам: безопасно, он должен быть объявлен изменчивым.
Вы должны заменить эту целую конструкцию на ManualResetEvent
, которая является поточно-безопасной и быстрой.
private static readonly ManualResetEvent ev = new ManualResetEvent();
private static void Main()
{
ev.WaitOne()
}
private static void SomeOtherThread()
{
Thread.Sleep(1000);
ev.Set();
}