【问题标题】:Android set thread affinityAndroid 设置线程亲和性
【发布时间】:2013-04-25 13:03:25
【问题描述】:

根据this StackOverflow question 的回答,我该如何创建正确的 掩码的整数?

我做了一些谷歌搜索,我发现的所有内容都使用来自 sched.hCPU_SET 宏,但它在使用 NDK 时未定义的 cpu_set_t 结构上运行。当尝试使用CPU_SET 时,链接器给了我未定义的引用错误(即使我链接到 pthread)。

【问题讨论】:

    标签: android c multithreading android-ndk multicore


    【解决方案1】:

    尝试在包含 <sched.h> 之前添加它

    #define _GNU_SOURCE
    

    【讨论】:

      【解决方案2】:

      我想提请您注意,第一篇文章中链接中的函数不会设置线程 cpu 亲和性。适合设置进程cpu亲和力。当然,如果您的应用程序中有一个线程,它工作得很好,但多个线程是错误的。检查 sched_setaffinity() 描述,例如 on http://linux.die.net/man/2/sched_setaffinity

      【讨论】:

      • 欢迎来到Stack Overflow。这是否意味着回复,如果是,回复给谁?
      • 很遗憾,我无法在 cmets 上添加 cmets。所以我在这里留下了我的评论。
      【解决方案3】:

      嗯,最后我找到了一些直接取自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 时,这很有效。

      【讨论】:

      • 显然 Bionic 在 sched.h 中支持 cpu_set_t,但 NDK 标头已将该部分撕掉。我想知道 Google 的人是怎么想的,如果他们在使用 NDK(均由 Google 开发和维护)打包 Bionic 时会破坏 Bionic。
      • @Samveen 他们可能不想将所有 API 暴露给 NDK 应用程序,原因
      猜你喜欢
      • 2019-10-22
      • 2014-08-30
      • 2017-12-06
      • 2011-01-15
      • 2012-11-07
      • 1970-01-01
      相关资源
      最近更新 更多