C++ 创建线程之前的Pthread关联
在创建线程之前,我需要设置关联(线程到核心,例如:第一个线程到第一个核心)。类似于C++ 创建线程之前的Pthread关联,c++,pthreads,affinity,C++,Pthreads,Affinity,在创建线程之前,我需要设置关联(线程到核心,例如:第一个线程到第一个核心)。类似于OpenMP中的KMP\u AFFINITY。可能吗 编辑: 我试着用这种方法,但不起作用:/ void* DoWork(void* args) { int nr = (int)args; printf("Wątek: %d, ID: %d, CPU: %d\n", nr,pthread_self(), sched_getcpu()); } int main() { int c
OpenMP
中的KMP\u AFFINITY
。可能吗
编辑:
我试着用这种方法,但不起作用:/
void* DoWork(void* args)
{
int nr = (int)args;
printf("Wątek: %d, ID: %d, CPU: %d\n", nr,pthread_self(), sched_getcpu());
}
int main()
{
int count = 8;
pthread_t threads[count];
pthread_attr_t attr;
cpu_set_t mask;
CPU_ZERO(&mask);
pthread_attr_init(&attr);
for (int i = 0; i < count ; i++)
CPU_SET(i, &mask);
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &mask);
for(int i=0; i<count ; i++)
{
pthread_create(&threads[i], &attr, DoWork, (void*)i);
}
for(int i=0; i<count ; i++)
{
pthread_join(threads[i], NULL);
}
}
void*DoWork(void*args)
{
int nr=(int)args;
printf(“Wątek:%d,ID:%d,CPU:%d\n”,nr,pthread_self(),sched_getcpu());
}
int main()
{
整数计数=8;
pthread_t线程[计数];
pthread_attr_t attr;
cpu设置屏蔽;
CPU_零(和掩码);
pthread_attr_init(&attr);
for(int i=0;i 对于(inti=0;i您可以调用pthread_self()要获取主线程的线程id并在pthread_setaffinity_np中使用它。您可以使用pthread_attr_setaffinity_np
为pthread_create
函数设置关联属性。如前所述,您应该使用pthread_attr_setaffinity_np
将线程绑定到特定的内核。CPU的数量可以检索系统中可用的内核(请参阅下面的代码)
在使用pthread\u create
创建线程时,每次都必须传递一个pthread\u attr\u t
实例,该实例由相应的cpu\u set\u t
设置。每次都必须清除cpu\u set\u t
或删除以前输入的数字(我选择了前一个选项)在将CPU核心的下一个标识符添加到集合之前。如果要确定线程将在哪个CPU上执行,则在创建线程时,集合中必须只有一个CPU(请参阅下面的代码)
#包括
#包括
#包括
void*DoWork(void*args){
printf(“ID:%lu,CPU:%d\n”,pthread_self(),sched_getcpu());
返回0;
}
int main(){
int numberOfProcessors=sysconf(\u SC\u NPROCESSORS\u ONLN);
printf(“处理器数量:%d\n”,numberOfProcessors);
pthread_t threads[numberOfProcessors];
pthread_attr_t attr;
cpu设置cpu;
pthread_attr_init(&attr);
对于(int i=0;i
您可以设置关联,以便它运行所有硬件线程中的所有线程。您必须为每个线程分别设置关联,即在线程创建循环中移动关联设置。好的。我尝试了。可以在为所有创建的线程运行程序后设置关联?例如,当我多次使用线程表时。您可以使用t使用pthread_setaffinity_np创建的线程的关联性
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* DoWork(void* args) {
printf("ID: %lu, CPU: %d\n", pthread_self(), sched_getcpu());
return 0;
}
int main() {
int numberOfProcessors = sysconf(_SC_NPROCESSORS_ONLN);
printf("Number of processors: %d\n", numberOfProcessors);
pthread_t threads[numberOfProcessors];
pthread_attr_t attr;
cpu_set_t cpus;
pthread_attr_init(&attr);
for (int i = 0; i < numberOfProcessors; i++) {
CPU_ZERO(&cpus);
CPU_SET(i, &cpus);
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus);
pthread_create(&threads[i], &attr, DoWork, NULL);
}
for (int i = 0; i < numberOfProcessors; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}