2011-09-19 438 views
13

是否可以在使用Android NDK編譯的本地C代碼中設置CPU關聯?由於系統使用的是Linux內核,因此應該可以使用sched_setaffinity/sched_getaffinity函數,但是當我使用NDK進行編譯時,出現錯誤,抱怨cpu_set_t類型未知(用作函數的參數) 。有沒有其他方法可以實現這一點?當我用CodeSourcerys ARM編譯器(arm-none-linux-gnueabi-gcc)進行編譯時,這似乎不成問題,所以系統顯然支持所需的系統調用。是否可以在Android中設置與sched_setaffinity的親和力?

回答

17

下面的代碼與NDK R5或更新效果很好:

#include <sys/syscall.h> 
#include <pthread.h> 
void setCurrentThreadAffinityMask(int mask) 
{ 
    int err, syscallres; 
    pid_t pid = gettid(); 
    syscallres = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask); 
    if (syscallres) 
    { 
     err = errno; 
     LOGE("Error in the syscall setaffinity: mask=%d=0x%x err=%d=0x%x", mask, mask, err, err); 
    } 
} 
+0

謝謝,這似乎工作!我對隱式聲明gettid()有些抱怨,但即使我包含sys/types.h(應該是正確的文件),我也無法讓編譯器停止抱怨。有任何想法嗎? – Leo

+0

我認爲應該有'unistd.h'而不是'pthread.h'。在我的項目中有太多包含,我不確定這個函數需要哪些。 –

+0

@Andrey Kamaev:嗨,我正在嘗試使用你的功能。什麼是輸入掩碼值? – Nrupatunga

相關問題