我知道有
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);
}`
您误解了
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
可能是明智的。