Это (volatile bool) всегда безопасно для потоков? - PullRequest
22 голосов
/ 08 января 2012

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

Ответы [ 2 ]

11 голосов
/ 08 января 2012

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

10 голосов
/ 08 января 2012

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

private static readonly ManualResetEvent ev = new ManualResetEvent();

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

private static void SomeOtherThread()
{
    Thread.Sleep(1000);
    ev.Set();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...