在执行之前在std :: thread中设置affinity

时间:2017-03-14 11:23:09

标签: 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);
}

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

如果我将亲和力设置为线程代码中的第一个东西,则传递零

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对象设置线程关联?

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

0 个答案:

没有答案