Можно ли прервать поток .NET между методом, возвращающим и присваивающим его возвращаемое значение (без прерывания процесса)? - PullRequest
0 голосов
/ 03 января 2019

Возможно ли .NET-потоку каким-то образом прекратить выполнение между временем, которое возвращает метод, и временем, когда его возвращаемое значение присваивается переменной / полю?Конечно, возможно завершение всего процесса или выключение машины, но возможно ли это, если процесс продолжает работать?

Например:

class Test
{
     public static readonly Mutex MyMutex = new Mutex(false);
     public static bool MutexAcquired = false;

     private static bool AcquireMutex() => MyMutex.WaitOne(1000);

     public static void DoSomething()
     {
         MutexAcquired = AcquireMutex();
     }
}

Возможно ли эточто выполнение DoSomething() получит мьютекс (WaitOne возвращает true), но что-то прервет поток, прежде чем значение MutexAcquired изменится с false на true (но процесс как-то продолжает выполняться, так что что-то еще можетчитать неправильное значение MutexAcquired)?Было бы что-то другое, если бы MutexAcquired был локальным вместо поля?

(я понимаю, что, как написано, метод AcquireMutex, вероятно, будет встроенным, но давайте предположим, что он более сложный на практике,так что это не встроено.)

1 Ответ

0 голосов
/ 03 января 2019

Да, это вполне возможно. Не гарантируется, что назначения будут атомарными, и поток может быть прерван в любое время (никто не может сказать, когда истечет его квант, или нужно будет запланировать поток с более высоким приоритетом).

Затем вы также должны учитывать, что Commpiler или CPU могут оптимизировать ваш код, чтобы сделать его еще менее поточно-ориентированным. Подробнее здесь .

Если MutexAcquired - локальная переменная, она будет доступна только текущему потоку, поэтому блокировка не требуется. Блокировка / атомарные операции необходимы только тогда, когда доступ к данным осуществляется несколькими потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...