增加 Android 系统下进程和线程的 CPU 亲和性设置参考程序.

Signed-off-by: rick.chan <chenyang@autoai.com>
This commit is contained in:
rick.chan 2021-06-07 16:05:40 +08:00
parent b5126df99d
commit bba3271108
2 changed files with 92 additions and 0 deletions

View File

@ -0,0 +1,13 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := CpuAffinityDemo
LOCAL_MODULE_TAGS := optional
LOCAL_VENDOR_MODULE := true
LOCAL_LDLIBS := -lc
LOCAL_SRC_FILES := \
main.cpp
include $(BUILD_EXECUTABLE)

View File

@ -0,0 +1,79 @@
/**
* @file main.cpp
* @author Rick Chan
* @brief Android 线 CPU .
* @version 0.1
* @date 2021-06-07
*
* @copyright Copyright (c) 2020
*
*/
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/syscall.h>
int SetProcessAffinity(void) {
cpu_set_t set;
pid_t pid = getpid();
// 进程只在核 3 和核 7 上执行.
CPU_ZERO(&set);
CPU_SET(3, &set);
CPU_SET(7, &set);
int res, err;
(void)res;
(void)err;
res = sched_setaffinity(pid, sizeof(set), &set);
err = errno;
return res;
}
void SetThreadAffinity(int mask) {
int err, syscallres;
pid_t pid = gettid();
// Linux 下可以直接使用 pthread_setaffinity_np() 函数将当前线程绑定在具体的 CPU 上, 而 Android 屏蔽了该 API, 需要通过 syscall(__NR_sched_setaffinity) 来实现.
syscallres = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask);
if (syscallres) {
err = errno;
}
}
void* DemoRoutine0(void* arg)
{
(void)arg;
// DemoRoutine0 只运行在核 3 上.
SetThreadAffinity(1<<3);
while(1);
return nullptr;
}
void* DemoRoutine1(void* arg)
{
(void)arg;
// DemoRoutine0 只运行在核 7 上.
SetThreadAffinity(1<<7);
while(1);
return nullptr;
}
int main(void)
{
pthread_t demoThrd0, demoThrd1;
cpu_set_t set;
sched_getaffinity(getpid(), sizeof(set), &set);
printf("Init CPU Setbits=%lu.\r\n", set.__bits[0]);
SetProcessAffinity();
sched_getaffinity(getpid(), sizeof(set), &set);
printf("Init CPU Setbits=%lu.\r\n", set.__bits[0]);
pthread_create(&demoThrd0, nullptr, DemoRoutine0, nullptr);
pthread_create(&demoThrd1, nullptr, DemoRoutine1, nullptr);
pthread_join(demoThrd0, nullptr);
pthread_join(demoThrd1, nullptr);
return 0;
}