Маски Привязки ЦП (Помещающий Потоки на различные центральные процессоры)

У меня есть 4 потока, и я пытаюсь установить поток 1, чтобы работать на ЦП 1, распараллелить 2 на ЦП 2, и т.д. Однако, когда я выполняю свой код ниже, маски привязки возвращают правильные значения, но когда я делаю sched_getcpu () на потоках, они все возвращают это, они работают на ЦП 4.

Кто-либо знает, какова моя проблема здесь?

Заранее спасибо!

#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sched.h>
#include <errno.h>

void *pthread_Message(char *message)
{
    printf("%s is running on CPU %d\n", message, sched_getcpu());
}

int main()
{
    pthread_t thread1, thread2, thread3, thread4;
    pthread_t threadArray[4];
    cpu_set_t cpu1, cpu2, cpu3, cpu4;
    char *thread1Msg = "Thread 1";
    char *thread2Msg = "Thread 2";
    char *thread3Msg = "Thread 3";
    char *thread4Msg = "Thread 4";
    int thread1Create, thread2Create, thread3Create, thread4Create, i, temp;

    CPU_ZERO(&cpu1);
    CPU_SET(1, &cpu1);
    temp = pthread_setaffinity_np(thread1, sizeof(cpu_set_t), &cpu1);
    printf("Set returned by pthread_getaffinity_np() contained:\n");
    for (i = 0; i < CPU_SETSIZE; i++)
        if (CPU_ISSET(i, &cpu1))
            printf("CPU1: CPU %d\n", i);

    CPU_ZERO(&cpu2);
    CPU_SET(2, &cpu2);
    temp = pthread_setaffinity_np(thread2, sizeof(cpu_set_t), &cpu2);
    for (i = 0; i < CPU_SETSIZE; i++)
        if (CPU_ISSET(i, &cpu2))
            printf("CPU2: CPU %d\n", i);

    CPU_ZERO(&cpu3);
    CPU_SET(3, &cpu3);
    temp = pthread_setaffinity_np(thread3, sizeof(cpu_set_t), &cpu3);
    for (i = 0; i < CPU_SETSIZE; i++)
        if (CPU_ISSET(i, &cpu3))
            printf("CPU3: CPU %d\n", i);

    CPU_ZERO(&cpu4);
    CPU_SET(4, &cpu4);
    temp = pthread_setaffinity_np(thread4, sizeof(cpu_set_t), &cpu4);
    for (i = 0; i < CPU_SETSIZE; i++)
        if (CPU_ISSET(i, &cpu4))
            printf("CPU4: CPU %d\n", i);

    thread1Create = pthread_create(&thread1, NULL, (void *)pthread_Message, thread1Msg);
    thread2Create = pthread_create(&thread2, NULL, (void *)pthread_Message, thread2Msg);
    thread3Create = pthread_create(&thread3, NULL, (void *)pthread_Message, thread3Msg);
    thread4Create = pthread_create(&thread4, NULL, (void *)pthread_Message, thread4Msg);

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);
    pthread_join(thread4, NULL);

    return 0;
}
17
задан hahuang65 1 April 2010 в 20:27
поделиться

2 ответа

Вы пытаетесь установить сродство потоков, которые вы не инициализировали.

Правка: Хорошо, позвольте мне дать вам дополнительную информацию:

Не смешивайте дескрипторы потоков (то, что вы храните в переменной pthread_t) и то, что они представляют (поток выполнения, который где-то выполняется). Что вы пытались сделать, так это установить свойство потока перед его запуском с помощью API, которому требуется объект потока. Как это бывает, pthread_create создает объект и одновременно запускает выполнение, поэтому попытка использовать pthread_setaffinity_np - неправильный путь (это полезно, если вы хотите изменить родство текущего запущенного потока).

Но ... pthread_create имеет параметр атрибута (вы передаете ему NULL). Это хранит информацию о том, как вы хотите создать поток.

Сходство - это один из атрибутов, который можно установить с помощью этого параметра. См. Документацию на странице руководства для pthread_attr_init и pthread_attr_setaffinity_np , чтобы узнать, как именно

16
ответ дан 30 November 2019 в 13:27
поделиться

Я думаю, что проще всего было бы указать маску ЦП в качестве параметра для каждого потока и задать для запроса потока само сходство, как в примере здесь: pthread_setaffinity_np (3) .

2
ответ дан 30 November 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: