我希望在执行之前将某些线程映射到某些处理器,方法是在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);
}
尽管此代码完成了这项工作,但它在线程执行的未指定时刻设置了关联,导致处理器可能必须在执行期间将线程移动到另一个处理器。
如果我将亲和力设置为线程代码中的第一个东西,则传递零
int rc = pthread_setaffinity_np(0, sizeof(cpu_set_t), &cpuset);
我得到分段错误。如果我通过pthread_self()
而不是零,我会将EINVAL作为回报。
int rc = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
但是,在执行开始后更改线程的亲和性也可能导致线程被移动。
那么如何在执行开始之前使用现代std :: thread对象设置线程关联?
编辑:我不关心优先级,只关注映射到某些核心。