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 对象设置线程关联性?
编辑:我不关心优先级,只关心映射到某些核心。
| 归档时间: |
|
| 查看次数: |
3192 次 |
| 最近记录: |