为什么CPU_SET采用整数而不是无符号整数作为第一个参数?

问题描述 投票:0回答:1

我知道有

CPU_SET(int cpu, cpu_set_t *set)
用于设置核心亲和力。根据该函数的签名,我们还可以将负数作为 cpu_id 传递给 CPU 组。您能解释一下这有什么意义吗?这是否意味着存在 ID 为负的 CPU 或者背后有另一个逻辑/想法?

`iniline auto setThreadCore(int core_id) noexcept {

  cpu_set_t cpuset;
  CPU_ZERO(&cpuset)
  CPU_SET(core_id, &cpuset)

  return (pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset) == 0);
}`
c++ pthreads cpu affinity
1个回答
0
投票

您误解了

unsigned int
int
之间的区别。这是可以理解的;甚至 C++ 的作者也有同样的问题。

您认为

unsigned int
意味着
int
仅限于非负值。
unsigned int
实际上是某个未指定的 k(通常是 32)的整数 mod 2^k。注意我在这里使用整数而不是
int

同时

int
是一个以(包括)-2^(k-1) 和 -1+2^(k-1) 为界的整数,一旦离开该区域未定义,其行为就会发生。

对于大多数用途,

int
可以提供更好的体验。您可以更频繁地执行“
a-b
”之类的操作,并且对于中等大小的
a
b
获得毫不奇怪的答案。

当您使用

unsigned int
执行此操作时,当
a-b > a
a
均为正时,您会得到类似
b
的结果,这在代数上是令人惊讶的。

为此,C++ 委员会认为 C++ 标准中

unsigned
的大多数使用都是错误的。作为一个具体的例子,通常认为
std::vector<>.size()
应该返回一个有符号整数。额外的潜在大小位的好处远远超过了它作为模 2^32 值引起的疯狂数量的错误。

从这个角度来看,CPU-id (a) 不是模整数,并且 (b) 不太可能需要超过 2^31 个不同的值(甚至 2^15,

int
大小允许的最小限制)。所以在这里使用
int
可能是明智的。

© www.soinside.com 2019 - 2024. All rights reserved.