根据这个StackOverflow问题的答案,如何创建适当的掩码整数?
我进行了一些搜索,发现所有我找到的内容都使用sched.h
中的CPU_SET
宏,但使用NDK时会操作cpu_set_t
结构,该结构未定义。尝试使用CPU_SET
时,链接器会给出未定义引用错误(即使我链接了pthread)。
根据这个StackOverflow问题的答案,如何创建适当的掩码整数?
我进行了一些搜索,发现所有我找到的内容都使用sched.h
中的CPU_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
cpu_set_t
,但NDK头文件却将该部分剥离。我想知道Google的开发人员是如何思考的,如果他们在打包NDK时搞乱了Bionic(两者都由Google开发和维护)。 - Samveen