安卓设置线程亲和性

9

根据这个StackOverflow问题的答案,如何创建适当的掩码整数?

我进行了一些搜索,发现所有我找到的内容都使用sched.h中的CPU_SET宏,但使用NDK时会操作cpu_set_t结构,该结构未定义。尝试使用CPU_SET时,链接器会给出未定义引用错误(即使我链接了pthread)。

3个回答

14

最终我找到了一些直接从sched.h中提取的版本。如果有人遇到同样的问题并不想花时间搜索,我在这里发布这个版本。这非常有用。

#define CPU_SETSIZE 1024
#define __NCPUBITS  (8 * sizeof (unsigned long))
typedef struct
{
   unsigned long __bits[CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;

#define CPU_SET(cpu, cpusetp) \
  ((cpusetp)->__bits[(cpu)/__NCPUBITS] |= (1UL << ((cpu) % __NCPUBITS)))
#define CPU_ZERO(cpusetp) \
  memset((cpusetp), 0, sizeof(cpu_set_t))

当原始的setCurrentThreadAffinityMask函数中的参数类型被简单地替换为cpu_set_t时,这种方法可以正常工作。


显然,Bionic在sched.h中支持cpu_set_t,但NDK头文件却将该部分剥离。我想知道Google的开发人员是如何思考的,如果他们在打包NDK时搞乱了Bionic(两者都由Google开发和维护)。 - Samveen
2
@Samveen,他们可能不想将所有API暴露给NDK应用程序,出于某些原因。 - chrisvarnz

5

我想提醒您,第一篇帖子中链接的函数并没有设置线程CPU亲和力。它适用于设置进程CPU亲和力。当然,如果您的应用程序只有一个线程,那么它可以正常工作,但是对于多个线程来说却是错误的。例如,请查看sched_setaffinity()的描述(http://linux.die.net/man/2/sched_setaffinity)


欢迎来到 [so]。这是作为回复吗?如果是,回复给谁? - Qantas 94 Heavy
1
很遗憾,我无法在评论中添加评论。因此,我在这里留下了我的评论。 - Coreman

2

在包含<sched.h>之前,尝试添加以下内容:

#define _GNU_SOURCE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接