2013-05-01 133 views
6

this StackOverflow question得到答案如何为掩码创建合适的 整数?Android设置线程亲和力

我做了一些google搜索,我发现一切使用CPU_SET宏从sched.h但它cpu_set_t结构使用NDK时是不确定的操作。当尝试使用CPU_SET链接器给我未定义的引用错误(即使我链接到pthread)。

回答

10

那么,最后我发现了一些从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取代。

+0

之前显然仿生有'在[sched.h中] cpu_set_t'支持(https://android.googlesource.com /platform/bionic.git/+/master/libc/include/sched.h),但是NDK头文件已经将该部分删除了。我想知道谷歌的人们是怎么想的,如果他们用NDK打包(由谷歌开发和维护),它们就会破坏仿生。 – Samveen 2013-08-26 11:34:07

+1

@Samveen他们可能不想公开所有的API到NDK应用程序,原因 – chrisvarnz 2016-05-17 16:43:08

2

我想请注意,从第一篇文章中的链接函数不会设置线程cpu亲和力。它适合设置进程cpu亲和力。当然,如果你的应用程序中有一个线程,它可以很好地工作,但对于多个线程来说是错误的。检查起来了sched_setaffinity()描述例如on http://linux.die.net/man/2/sched_setaffinity

+0

欢迎来到[so]。这是否意味着作为答复,如果是这样,给谁? – 2014-02-02 13:55:03

+0

不幸的是,我无法在评论中添加评论。所以我在这里留下了我的评论。 – Coreman 2014-02-02 14:03:03

2

尝试添加这是你包括<sched.h>

#define _GNU_SOURCE