执行前在 std::thread 中设置亲和力

k_k*_*kaz 5 c++ multithreading affinity

我想在执行之前将某些线程映射到某些处理器,就像我们通过传递pthread_attr_t对象pthread_create一样std::thread。我已经尝试过以下方法:

std::vector<std::thread> threads;
for (int i = 0; i<num_threads; i++) {
    threads.push_back(std::thread(&some_struct::run, some_structs_vector.at(i)));
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(i, &cpuset);
    int rc = pthread_setaffinity_np(threads.at(i).native_handle(), sizeof(cpu_set_t), &cpuset);
    assert(rc == 0);
}
Run Code Online (Sandbox Code Playgroud)

尽管此代码完成了这项工作,但它在线程执行的未指定时刻设置了关联性,导致处理器可能必须在执行期间将线程移动到另一个处理器。

如果我将亲和力设置为线程代码中的第一件事,通过传递零

int rc = pthread_setaffinity_np(0, sizeof(cpu_set_t), &cpuset);
Run Code Online (Sandbox Code Playgroud)

我遇到分段错误。如果我通过pthread_self()而不是零,我会得到 EINVAL 作为返回。

int rc = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
Run Code Online (Sandbox Code Playgroud)

但是,在执行开始后更改线程的关联性也可能导致线程被移动。

那么,在执行开始之前,如何使用现代 std::thread 对象设置线程关联性?

编辑:我不关心优先级,只关心映射到某些核心。