2013-05-01 11 views
6

Po odpowiedzi z this StackOverflow question w jaki sposób utworzyć odpowiednią liczbę całkowitą dla maski?Ustawienie powinowactwa dla systemu Android:

Zrobiłem trochę google i wszystko, co znalazłem, używa makro CPU_SET z sched.h, ale działa na strukturach cpu_set_t, które są niezdefiniowane podczas używania NDK. Kiedy próbuję używać CPU_SET linker daje mi niezdefiniowany błąd referencyjny (nawet jeśli łączę się z pthread).

Odpowiedz

10

Cóż, w końcu znalazłem wersję, która została zaczerpnięta bezpośrednio z sched.h. Umieszczam to tutaj, jeśli ktoś ma ten sam problem i nie chce tracić czasu na poszukiwanie go. Jest to całkiem przydatne.

#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)) 

Działa to dobrze, gdy typ parametru w oryginale setCurrentThreadAffinityMask (ze stanowiska wymienionego w pytaniu) jest po prostu zastąpione cpu_set_t.

+0

Widocznie Bionic posiada wsparcie dla 'cpu_set_t' w [sched.h] (https://android.googlesource.com /platform/bionic.git/+/master/libc/include/sched.h), ale nagłówki NDK mają tę sekcję rozrzuconą. Zastanawiam się, jak ludzie z Google myślą, czy magują Bionica podczas pakowania go w NDK (zarówno opracowane, jak i utrzymywane przez Google). – Samveen

+1

@Samveen prawdopodobnie nie chcą ujawniać wszystkich interfejsów API aplikacjom NDK, z powodów – chrisvarnz

2

Chciałbym zwrócić uwagę, że funkcja z linku w pierwszym poście nie określa powinowactwa procesora wątku. Jest odpowiedni do ustawienia powinowactwa procesora. Oczywiście, jeśli masz jeden wątek w swojej aplikacji, działa dobrze, ale jest błędny w przypadku kilku wątków. Sprawdzać sched_setaffinity() opis np on http://linux.die.net/man/2/sched_setaffinity

+0

Witamy w [so]. Czy to ma oznaczać odpowiedź, a jeśli tak, to kto? –

+0

Niestety, nie mogę dodawać komentarzy do komentarzy. Więc zostawiłem tutaj mój komentarz. – Coreman

2

Spróbuj dodać ten przed włączeń <sched.h>

#define _GNU_SOURCE 
Powiązane problemy