OS X has supported a thread affinity API since version 10.5. Here is some relevant material from the webpage I linked to.
Affinity Set
An affinity set is a collection of threads which share memory resources and wish to share an L2 cache. Distinct affinity sets represent separate affinities—that is, threads belonging to a different set should use a separate L2 cache and hence be run on a different logical processors.
An affinity set is identified by a "tag". Threads are assigned to a particular affinity set by assigning it the tag identifying that set. A thread can belong to at most one affinity set; that is, it has one affinity tag.
Effect of Setting Distinct Affinity Tags
For example, an application wanting to run 2 threads on separate L2 caches would set the threads with different affinity tags. On a dual core machine, this affinity will effectively be ignored. However, on a 4-core MacPro, the scheduler will try to run threads on separate packages. Similarly, on an 8-core MacPro, the scheduler will try to run these threads on separate dies (which may or may not be in the same physical CPU package).
Example Usage
An application that wants to place a thread on every available processor would do the following:
- Obtain the number of processors on the system using sysctl(3).
- Create that number of threads.
- Set each thread with a distinct affinity tag.
- Start all threads.
Threads with default affinity policy will be scheduled more freely on any processor. These threads will be preferentially migrated to run on an idle processor. Threads with affinity tags will tend to remain in place.
Consult the source for code listings, and information about the sharing of affinity tags between parent and child processes, obtaining the CPU cache configuration, and more.