Ответ полностью зависит от ответа на вопрос:
«вам нужно запускать doIt
ровно один раз для каждого раза, когда основной поток устанавливает флаг shouldDoIt?»
Если ответ на этот вопрос «да», то ваш код не будет работать, потому что основной поток может установить shouldDoIt
на YES
после того, как вы запустили doIt
, но до того, как вы сбросили флаг.
Если ответ «нет», то в этом узком случае у вас есть что-то вроде ОК, за исключением того факта, что в конфигурации с несколькими ЦП флаг может кэшироваться таким образом, что другой поток делаетне сразу вижу изменения.Таким образом, вы, по крайней мере, хотите использовать OSAtomicTestAndClearBarrier () и OSAtomicTestAndSetBarrier (), которые имеют низкий уровень, следовательно, настолько быстрый, насколько вы можете получить.
Однако я скептически отношусь к тому, что вам нужносделать это.Я думаю, вы могли бы найти, что рефакторинг дизайна каким-то образом даст лучшие результаты в зависимости от того, что вы пытаетесь сделать в doIt
, do stuff
и do more stuff
.