Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建线程之前的Pthread关联_C++_Pthreads_Affinity - Fatal编程技术网

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;
}