1

在 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或替代接口来实现这一点?

4

2 回答 2

1

跟进这一点,由于我的困惑:

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

可以读入包含更多信息的 struct lwpsinfo,您可以从中确定您是否正在查看所需的线程。看/usr/include/sys/procfs.h

或者man -s 4 proc

于 2013-01-04T03:41:00.347 回答
0

Solaris 11 内核具有关键的线程优化。您设置了哪些线程需要特别小心,其余的由内核完成。这似乎是你想要的。请阅读这个简短的解释,看看我是否理解你想要的。

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

以上为备用。它可能根本不适合你。但是,根据 Oracle,它是首选机制。

对于 Solaris 10 pthread_t tididtype_tP_LWPID调用processor_bind. 这适用于 Solaris 8 -> 11。它仅适用于进程中的 LWP。我不清楚这是否是你的模型。

高温高压

于 2012-12-31T01:42:54.320 回答