Android设置线程亲和性



从这个StackOverflow问题的答案,我如何创建适当的掩码是整数吗?

我做了一些谷歌搜索,我发现的一切都使用sched.hCPU_SET宏,但它在使用NDK时未定义的cpu_set_t结构上运行。当尝试使用CPU_SET链接器给我未定义的引用错误(即使我链接到pthread)。

最后我找到了一些直接取自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时,这工作得很好。

我想要注意的是,在第一篇文章中链接的函数没有设置线程cpu亲和力。适合设置进程cpu亲和度。当然,如果您的应用程序中只有一个线程,那么它工作得很好,但对于多个线程则是错误的。查看sched_setaffinity()描述,例如在http://linux.die.net/man/2/sched_setaffinity

尝试在包含<sched.h>之前添加此

#define _GNU_SOURCE

相关内容

  • 没有找到相关文章

最新更新