從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