Вот ссылка на аппловский гид - https://developer.apple.com/library/.../uid/10000057i
А вот кусок про структуры (страница 21, если в пдф смотреть )
Threading has a real cost to your program (and the system) in terms of memory use and performance. Each thread requires the allocation of memory in both the kernel memory space and your program’s memory space. The core structures needed to manage your thread and coordinate its scheduling are stored in the kernel using wired memory. Your thread’s stack space and per-thread data is stored in your program’s memory space. Most of these structures are created and initialized when you first create the thread—a process that can be relatively expensive because of the required interactions with the kernel.
Table 2-1 quantifies the approximate costs associated with creating a new user-level thread in your application. Some of these costs are configurable, such as the amount of stack space allocated for secondary threads. The time cost for creating a thread is a rough approximation and should be used only for relative comparisons with each other. Thread creation times can vary greatly depending on processor load, the speed of the computer, and the amount of available system and program memory. Добавлено через 36 минут
К стати вот еще описание когда нужно применять ран луп:
When Would You Use a Run Loop?
The only time you need to run a run loop explicitly is when you create secondary threads for your application. The run loop for your application’s main thread is a crucial piece of infrastructure. As a result, both Cocoa and Carbon provide the code for running the main application loop and start that loop automatically. The run method of UIApplication in iOS (or NSApplication in Mac OS X) starts an application’s main loop as part
2010-04-28 | © 2010 Apple Inc. All Rights Reserved. 41
Using Run Loop Objects
of the normal startup sequence. Similarly, the RunApplicationEventLoop function starts the main loop for Carbon applications. If you use the Xcode template projects to create your application, you should never have to call these routines explicitly.
For secondary threads, you need to decide whether a run loop is necessary, and if it is, configure and start it yourself. You do not need to start a thread’s run loop in all cases. For example, if you use a thread to perform some long-running and predetermined task, you can probably avoid starting the run loop. Run loops are intended for situations where you want more interactivity with the thread. For example, you need to start a run loop if you plan to do any of the following:
Use ports or custom input sources to communicate with other threads. Use timers on the thread.
Use any of the performSelector... methods in a Cocoa application. Keep the thread around to perform periodic tasks.
If you do choose to use a run loop, the configuration and setup is straightforward. As with all threaded programming though, you should have a plan for exiting your secondary threads in appropriate situations. It is always better to end a thread cleanly by letting it exit than to force it to terminate. Information on how to configure and exit a run loop is described in “Using Run Loop Objects” (page 42).