cpu_set_t cpuset;
CPU_ZERO(&cpuset);
std::cout << "current cpu: " << sched_getcpu() << std::endl;
CPU_SET(sched_getcpu(), &cpuset);
if (pthread_setaffinity_np(std_thread.getNativeHandle(), sizeof(cpu_set_t), &cpuset) == 0) {
std::cout << "Afinity ok!!!" << std::endl;
} else {
std::cout << "second thread set affinity failed." << std::endl;
}
По сути, я пытаюсь, чтобы основной поток (main ()) и новый созданный поток (std_thread) работали в одном процессоре. Код распечатывает «Afinity ok !!!» но когда я проверяю, какой процессор используют оба потока в htop tool, они все время меняются случайным образом, что означает сбой кода.
Если в коде нет веских причин для этого, вы можете использовать taskset
команда и может быть сделано как во время создания процесса, так и во время выполнения
если вы хотите запустить процесс в определенном процессоре, укажите число как
taskset -c <CPUNumber> ProgramName
или динамически вы можете изменить с помощью PID
taskset -cp <CPUNumber> PID
С pthread_getaffinity_np()
, вы получаете близость вашей нити в cpuset
, Если вы проверите значение этого набора процессоров, вы должны заметить, что он охватывает все процессоры вашего компьютера. Действительно, по умолчанию потоки могут использовать любой процессор компьютера. То, что делает ваш код, это просто устанавливает сходство вашего другого потока со всей машиной (другими словами, ничего).
Что вы должны сделать, это на самом деле установить один процессор в cpuset
, а затем установите сродство обеих ваших тем. Вы также можете использовать sched_getcpu()
чтобы получить процессор, на котором работает один из ваших потоков, установите этот процессор в cpuset
, а затем установите близость обоих потоков к этому набору процессоров.