2013-05-01 125 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