Запись в логическое поле из разных потоков является поточно-ориентированной - это означает, что операция записи является атомарной.Ни один наблюдатель поля никогда не увидит «частичное значение», поскольку значение записывается в поле.При больших типах данных частичная запись является реальной возможностью, потому что для записи значения в поле требуются несколько инструкций ЦП.
Таким образом, фактическая запись логического значения не является проблемой безопасности потока.Однако то, как наблюдатели используют это логическое поле, может быть проблемой безопасности потока.В вашем примере единственным видимым наблюдателем является функция RecursiveSearch, и ее использование значения FCancel довольно просто и безвредно.Наблюдатель за состоянием FCancel не изменяет состояние FCancel, поэтому это прямая / ациклическая зависимость типа производитель-потребитель.
Если вместо этого код использовал логическое поле для определения необходимости однократной операциичтобы сделать это, простого чтения и записи в логическое поле будет недостаточно, поскольку наблюдатель булевого поля также должен изменить поле (чтобы отметить, что была выполнена одноразовая операция).Это цикл чтения-изменения-записи, и он небезопасен, когда два или более потоков выполняют одинаковые шаги в нужное время.В этой ситуации вы можете установить блокировку мьютекса на одноразовую операцию (и проверку и обновление логического поля) или использовать InterlockedExchange для обновления и тестирования логического поля без мьютекса.Вы также можете переместить одноразовую операцию в конструктор статического типа, и вам не придется поддерживать какие-либо блокировки самостоятельно (хотя .NET может использовать блокировки за кулисами для этого).