Подтвердить что ты не робот

Является ли этот (volatile bool) безопасным потоком?

Мне интересно, полностью ли это потокобезопасно, и должно ли ключевое слово 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 требуется, потому что тогда никогда не будет возможно кэшировать значение в регистре или аналогичные оптимизации.

4b9b3361

Ответ 1

Разумеется, то, о чем ответили SLaks, конечно, но чтобы ответить на ваш вопрос: да по обоим пунктам: безопасно, он должен быть объявлен изменчивым.

Ответ 2

Вы должны заменить эту целую конструкцию на ManualResetEvent, которая является поточно-безопасной и быстрой.

private static readonly ManualResetEvent ev = new ManualResetEvent();

private static void Main()
{
    ev.WaitOne()
}

private static void SomeOtherThread()
{
    Thread.Sleep(1000);
    ev.Set();
}