从Solaris上的pthread_t获取LWP id以与processor_bind一起使用

时间:2012-12-29 20:13:27

标签: pthreads solaris setthreadaffinitymask

在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或替代界面实现此目的?

2 个答案:

答案 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