Получить идентификатор LWP из pthread_t в Solaris для использования с processor_bind

На солярисе, processor_bind используется для установки сродства к потокам. Вам нужно знать LWPID целевого потока или использовать константу P_MYID ссылаться на себя.

У меня есть функция, которая выглядит так:

void set_affinity(pthread_t thr, int cpu_number)
{
   id_t lwpid = what_do_I_call_here(thr);
   processor_bind(P_LWPID, lwpid, cpu_number, NULL);
}

В действительности в моей функции есть куча кроссплатформенных вещей, которые я выбрал для ясности.

Ключевым моментом является то, что я хотел бы установить сходство произвольного pthread_t, поэтому я не могу использовать P_MYID,

Как я могу добиться этого с помощью processor_bind или альтернативный интерфейс?

2 ответа

Решение

В связи с этим и из-за моей путаницы:

Lwpid - это то, что создано

pthread_create( &lwpid, NULL, some_func, NULL);

Данные потока доступны извне процессу, который не является pthread_create() позвонить - через /proc интерфейс

/proc/<pid>/lwp/<lwpid>/    lwpid == 1 is the main thread, 2 .. n are the lwpid in the above example.

Но это почти ничего не говорит о том, с каким потоком вы имеете дело, за исключением того, что это lwpid в приведенном выше примере.

/proc/pid/lwp/lwpid/lwpsinfo

может быть прочитан в структуру lwpsinfo, которая содержит еще немного информации, из которой вы можете определить, смотрите ли вы на нужный поток. увидеть /usr/include/sys/procfs.h

Или же man -s 4 proc

Ядро Solaris 11 имеет критическую оптимизацию потоков. Вы устанавливаете, какие потоки требуют особого внимания, а остальное делает ядро. Похоже, это то, что вы хотите. Пожалуйста, прочтите это краткое объяснение, чтобы увидеть, понял ли я, что вы хотите.

https://blogs.oracle.com/observatory/entry/critical_threads_optimization

Выше приведен альтернативный вариант. Это может не летать вообще для вас. Но это предпочтительный механизм, согласно Oracle.

Для Solaris 10 используйте pthread_t tid LWP с idtype_t из P_LWPID в вашем звонке processor_bind, Это работает в Solaris 8 -> 11. Это работает ТОЛЬКО для LWP в процессе. Мне не ясно, если это ваша модель.

НТН

Другие вопросы по тегам