在Solaris上,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
或替代界面实现此目的?
答案 0 :(得分:1)
跟进此事,由于我的困惑:
lwpid是由
创建的pthread_create( &lwpid, NULL, some_func, NULL);
线程数据可通过pthread_create()
界面<{1}}调用 - 而不是进行/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
可以读入struct lwpsinfo,它包含更多信息,您可以从中确定是否正在查看所需的线程。见/usr/include/sys/procfs.h
或man -s 4 proc
答案 1 :(得分:0)
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 - &gt; 11.它仅适用于LWP的过程。我不清楚这是你的模特。
HTH