代码改变世界

linux affinity

2017-12-01 09:52  woodzcl  阅读(242)  评论(0编辑  收藏  举报

现在的CPU几乎都是多核,所以,分配给予进程相同数量的线程是合理的需求

但是,这些线程不一定就均匀跑在这些内核上

所以,我们要指派,“一个线程就运行在一个固定的CPU内核上”

//test.c

#define _GNU_SOURCE

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <pthread.h>

#include <sched.h>

 

void *myfun(void *arg)

{

    cpu_set_t mask;

    cpu_set_t get;

    char buf[256];

    int i;

    int j;

    int num = sysconf(_SC_NPROCESSORS_CONF);

    printf("system has %d processor(s)\n", num);

 

    for (i = 0; i < num; i++) {

        CPU_ZERO(&mask);

        CPU_SET(i, &mask);

        if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {

            fprintf(stderr, "set thread affinity failed\n");

        }

        CPU_ZERO(&get);

        if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {

            fprintf(stderr, "get thread affinity failed\n");

        }

        for (j = 0; j < num; j++) {

            if (CPU_ISSET(j, &get)) {

                printf("thread %d is running in processor %d\n", (int)pthread_self(), j);

            }

        }

        j = 0;

        while (j++ < 100000000) {

            memset(buf, 0, sizeof(buf));

        }

    }

    pthread_exit(NULL);

}

 

int main(int argc, char *argv[])

{

    pthread_t tid;

    if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0) {

        fprintf(stderr, "thread create failed\n");

        return -1;

    }

    pthread_join(tid, NULL);

    return 0;

}

//result

#gcc -o test.o -c test.c

#gcc -o test test.o -lpthread

#./test

 

Finally:

这项技术特别有用,不多说了