Вам нужно сделать что-то вроде:
- Вызовите sched_getaffinity и определите биты процессора
- Перебираем процессоры, делая sched_setaffinity для каждого
(Я не уверен, что после sched_setaffinity вы гарантированно будете на процессоре, или
надо явно уступить?)
- Выполнение CPUID (инструкция asm) ... есть способ получить уникальный идентификатор для каждого ядра из одного из его выходов (см. Документы Intel ). Я смутно помню, что это «APIC ID».
- Построить таблицу (std :: map?) Из идентификаторов APIC к номеру ЦП, маске сходства или чему-то еще.
- Если вы сделали это в своем основном потоке, не забудьте вернуть sched_setaffinity ко всем CPUS!
Теперь вы можете снова использовать CPUID, когда вам нужно, и посмотреть, на каком ядре вы находитесь.
Но я бы спросил, зачем тебе это делать; обычно вы хотите взять управление через sched_setaffinity вместо того, чтобы выяснить, на каком ядре вы находитесь (и даже это довольно редкая вещь, которую нужно / нужно). (Вот почему я не знаю решающей детали того, что именно нужно извлечь из CPUID, извините!)
Обновление: только что узнал о sched_getcpu из ответа litb здесь. Намного лучше! (хотя мой Debian / etch libc слишком стар, чтобы иметь его).