The Xbox One thread scheduler is based on the Windows 8 scheduler with features that are not needed for the console environment stripped out.
The key thread states to be aware of on the Xbox One are Running, Ready, and Waiting.
Each core has its own set of 32 ready queues, one queue for each priority level. When a core needs to run a new thread, it always chooses from its highest-priority non-empty ready queue (with a few minor exceptions). If multiple threads are present in the highest-priority ready queue, they are scheduled in a round-robin fashion. If all of a core’s ready queues are empty, the core tries to steal a ready thread from another core.

Note that if threads with a higher priority are always ready, a lower priority thread will never be called unless its priority is boosted by the OS or by calling SetThreadPriority with a higher priority.
When you create a thread you set the thread’s base priority. The actual priority of a thread is increased in some circumstances. The following is a list of common scenarios where a thread’s priority will be boosted:
Priority boosts can be disabled for a thread by calling SetThreadPriorityBoost.
You can cause a thread to yield by calling SwitchToThread, Sleep, or YieldProcessor. The behavior of each is described in the table below:
| Function | Behavior |
|---|---|
| SwitchToThread | Examines the ready queues for the current core and picks the highest-priority thread that is ready to run (even if that thread’s priority is lower than the priority of the calling thread). The selected thread runs for the remainder of the quantum. If there are no threads present in the current core’s ready queues, control is returned to the calling thread. |
| Sleep(0) | Exactly the same behavior as SwitchToThread. In Windows XP and earlier, Sleep(0) would only yield to threads of the same priority as the calling thread. This is not the case on Xbox One and on other modern Windows operating systems. |
| Sleep(x) | Places the calling thread in the waiting state. The OS examines the ready queues for the current core and picks the highest-priority thread that is ready to run. If there are no threads present in the current core’s ready queues, the OS examines the ready queues of the other cores and tries to steal a ready thread. If the ready queues for all other cores are also empty, the core becomes idle. |
| YieldProcessor | Does not yield to the OS thread scheduler, but instead compiles to a pause instruction. This lets the CPU know the hardware thread isn’t doing useful work. On Xbox One, when the CPU encounters a long string of pause instructions, it switches control to the host OS. The host OS will usually immediately return control to your title. On the PC it is best practice to call YieldProcessor inside spin loops, but on Xbox One, nothing bad is likely to happen if you don’t. |