从this StackOverflow question得到答案如何为掩码创建合适的 整数?Android设置线程亲和力
我做了一些google搜索,我发现一切使用CPU_SET
宏从sched.h
但它cpu_set_t
结构使用NDK时是不确定的操作。当尝试使用CPU_SET
链接器给我未定义的引用错误(即使我链接到pthread)。
从this StackOverflow question得到答案如何为掩码创建合适的 整数?Android设置线程亲和力
我做了一些google搜索,我发现一切使用CPU_SET
宏从sched.h
但它cpu_set_t
结构使用NDK时是不确定的操作。当尝试使用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()描述例如on http://linux.die.net/man/2/sched_setaffinity
欢迎来到[so]。这是否意味着作为答复,如果是这样,给谁? – 2014-02-02 13:55:03
不幸的是,我无法在评论中添加评论。所以我在这里留下了我的评论。 – Coreman 2014-02-02 14:03:03
尝试添加这是你包括<sched.h>
#define _GNU_SOURCE
之前显然仿生有'在[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
@Samveen他们可能不想公开所有的API到NDK应用程序,原因 – chrisvarnz 2016-05-17 16:43:08