【问题标题】:Is it possible to set affinity with sched_setaffinity in Android?是否可以在 Android 中使用 sched_setaffinity 设置亲和力?
【发布时间】:2011-11-20 00:53:53
【问题描述】:

是否可以在使用 Android NDK 编译的本机 C 代码中设置 CPU 亲和性?由于系统使用的是 Linux 内核,应该可以使用 sched_setaffinity/sched_getaffinity 函数,但是当我使用 NDK 编译时,我收到错误消息,抱怨 cpu_set_t 类型未知(用作函数的参数) .有没有其他方法可以做到这一点?当我使用 CodeSourcerys ARM 编译器 (arm-none-linux-gnueabi-gcc) 进行编译时,这似乎不是问题,因此系统显然支持所需的系统调用。

【问题讨论】:

    标签: c multithreading android-ndk multicore


    【解决方案1】:

    以下代码适用于 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);
        }
    }
    

    【讨论】:

    • 谢谢,这似乎有效!我收到一些关于 gettid() 的隐式声明的抱怨,但即使我包含 sys/types.h(应该是正确的文件),我也无法让编译器停止抱怨。有什么想法吗?
    • 我认为应该有unistd.h 而不是pthread.h。我的项目中包含太多内容,我不确定此功能需要哪些内容。
    • @Andrey Kamaev:嗨,我正在尝试使用您的功能。输入掩码值是多少?
    • 有关设置掩码的更多信息,请参阅stackoverflow.com/questions/16319725/…
    【解决方案2】:

    对于cpu_set_t,我能够使用Android NDK 的-D_GNU_SOURCE=1 选项进行编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2018-11-20
      相关资源
      最近更新 更多