SetThreadAffinityMask для систем Unix - PullRequest
1 голос
/ 14 мая 2011

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

Я использую инструкцию x86 RDTSC для генерации меток времени.Когда эта инструкция вызывается из разных ядер ЦП, могут использоваться разные счетчики меток времени, и поскольку разные счетчики не синхронизируются через ядра ЦП, могут появиться противоречивые результаты.

В окнах есть функция для принудительного вызова этогоповедение:

DWORD_PTR WINAPI SetThreadAffinityMask(
  __in  HANDLE hThread,
  __in  DWORD_PTR dwThreadAffinityMask
);

Устанавливает маску сродства процессора для указанного потока.

Ссылка MSDN

Есть ли что-топохож на unix-системы?

Ответы [ 2 ]

1 голос
/ 14 мая 2011

В Solaris вы можете использовать привязку ЦП, которая может применяться к отдельным потокам, отдельным процессам, множеству процессов или ко всем процессам в зоне. См. processor_bind и pbind .

1 голос
/ 14 мая 2011

Linux 2.5.8 и выше имеет sched_setaffinity () . Он часто используется на уровне процессов, но также работает с потоками:

Маска сродства на самом деле атрибут для потока, который может быть корректируется независимо для каждого из темы в группе потоков. Значение вернулся из звонка на gettid (2) банка передаваться в аргументе pid.

...