Модель потоков какао NSApplication

Привет, я новичок в фреймворке какао, поэтому мне нужна была помощь в понимании фреймворка.

Моя текущая сфера деятельности - узнать о количестве потоков, которые NSApplication создает по умолчанию, и о методах их управления или ограничения. то есть я видел базовое приложение NSApplication, которое создало пустое окно, создало 6 потоков и использовало его. Я хотел получить представление о следующем.

1) Есть ли способ ограничить количество потоков? 2) По умолчанию NSApplication использует GCD (Grand Central Dispatch), есть ли способ отключить его?

Я ищу эти вопросы, потому что хочу реализовать свою собственную потоковую модель с нуля ...

И я знаю, что GCD более эффективен и управляет потоками за меня. Я просто экспериментирую и хочу знать.

Так что, пожалуйста, поделитесь своим мнением или укажите мне правильное направление. заранее спасибо


person Shehzan    schedule 08.07.2014    source источник


Ответы (1)


Ты спросил:

Есть ли способ ограничить количество потоков?

Исходя из контекста вашего вопроса, я предполагаю, что вы имеете в виду: «Есть ли какой-либо способ ограничить количество потоков, используемых AppKit?», И фактически ответ - «нет». Используя AppKit, вы неявно принимаете любую потоковую модель, которую он хочет использовать за кулисами. Это черный ящик. Конечно, физически возможно написать однопоточный исполняемый файл в OS X (то есть инструмент командной строки), но отображение любого значимого графического интерфейса в OS X без использования AppKit будет много работы.

По умолчанию NSApplication использует GCD (Grand Central Dispatch), есть ли способ отключить его?

Опять же, нет. Причины те же.

Я хочу реализовать свою собственную потоковую модель с нуля ...

Это небольшое упрощение, но модель потоковой передачи в определенной степени продиктована ОС. Все, что вы написали, используя потоки mach (на которых основаны потоки p, на которых основан GCD и т. Д.), Не будет «реализовывать вашу собственную модель потоков», это будет та же модель потоков, которую используют все остальные. Точно так же (в OS X), если вы в конечном итоге не используете потоки mach, у вас нет возможности запустить действительно параллельный поток выполнения в том же процессе (потому что только ядро ​​может это сделать), поэтому в конце день, когда вы реализуете кооперативную систему многозадачности (которая может работать только на одном ядре) или разветвляете несколько процессов и используете общую память или что-то для координации между ними (и если вы это сделаете, вы все равно эффективно используете mach потоки, они просто находятся в разных процессах, созданных ядром.)

Если вы хотите повозиться с собственной реализацией пула потоков, просто сделайте это и игнорируйте фоновые потоки AppKit. В любом приложении AppKit основной поток всегда «особенный», поэтому вам также придется игнорировать этот факт, но если вы хотите написать пул потоков, не позволяйте тому, что делает AppKit, отвлекать вас.

Если вы действительно хотите поработать с базовой моделью потоковой передачи, вам лучше найти себе академическую / исследовательскую операционную систему (Google для онлайн-курсов университета по операционным системам) и возиться с ее планировщиком ядра / моделью потоковой передачи, чем пытаться заново - изобрести колесо в огромной, зрелой, ориентированной на массовый рынок операционной системе, заботящейся о безопасности, такой как OS X.

person ipmcc    schedule 08.07.2014
comment
Спасибо за ответ, это было очень полезно. На самом деле я имел в виду только новый пул потоков :) - person Shehzan; 09.07.2014
comment
Мне пришло в голову: если бы вы были действительно связаны и настроены, вы могли бы написать свою реализацию пула потоков, а затем написать прокладки для сопоставления между GCD API и вашим пулом потоков, а затем переключить GCD API в main перед вызовом NSApplicationMain (с использованием mach_override). Однако, если ваша реализация значительно отличается от семантики GCD или не реализует все функции, которые реализует GCD (которые использует AppKit), я бы не ожидал, что это сработает очень хорошо. По крайней мере, подключение GCD API к журналированию может рассказать вам больше о том, что делает AppKit ... просто мысль. - person ipmcc; 09.07.2014