установить два потока на одно и то же сродство процессоров pthread_getaffinity_np

    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, они все время меняются случайным образом, что означает сбой кода.

0

Решение

Если в коде нет веских причин для этого, вы можете использовать taskset команда и может быть сделано как во время создания процесса, так и во время выполнения

если вы хотите запустить процесс в определенном процессоре, укажите число как

taskset -c <CPUNumber> ProgramName

или динамически вы можете изменить с помощью PID

taskset -cp <CPUNumber> PID
3

Другие решения

С pthread_getaffinity_np(), вы получаете близость вашей нити в cpuset, Если вы проверите значение этого набора процессоров, вы должны заметить, что он охватывает все процессоры вашего компьютера. Действительно, по умолчанию потоки могут использовать любой процессор компьютера. То, что делает ваш код, это просто устанавливает сходство вашего другого потока со всей машиной (другими словами, ничего).

Что вы должны сделать, это на самом деле установить один процессор в cpuset, а затем установите сродство обеих ваших тем. Вы также можете использовать sched_getcpu() чтобы получить процессор, на котором работает один из ваших потоков, установите этот процессор в cpuset, а затем установите близость обоих потоков к этому набору процессоров.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector