2010-04-02 4 views
1

Мне удалось запустить мою программу pthreads. В основном я пытаюсь вручную установить близость 4 потоков, так что поток 1 работает на ЦП 1, поток 2 работает на ЦП 2, поток 3 работает на ЦП 3, а поток 4 работает на ЦПУ 4.pthreads_setaffinity_np: Недопустимый аргумент?

После компиляции, мой код работает для нескольких потоков, но не для других (кажется, что нить 1 никогда не работает), но запуск одной и той же скомпилированной программы несколько раз дает мне разные результаты.

Например:
хао @ горакс: ~/Desktop $ ./a.out
Темы 3 работает на процессоре 3
pthread_setaffinity_np: недопустимый аргумент
тема Тема 2 запущенные на ЦП 2
хао @Gorax: ~/Desktop $ ./a.out
тема 2 работает на процессоре 2
pthread_setaffinity_np: недопустимый аргумент
pthread_setaffinity_np: Недопустимый аргумент
тема 3 работает на процессоре 3
Тема 3 работает на процессоре 3
хао @ горакса: ~/Desktop $ ./a.out
Тема 2 работает на процессоре 2
pthread_setaffinity_np: недопустимый аргумент
Тема 4 работает от ЦП 4
тема 4 работает на процессоре 4
хао @ горакса: ~/Desktop $ ./a.out
pthread_setaffinity_np: Недопустимый аргумент

Мой вопрос «Почему это происходит? Кроме того, почему иногда печатают сообщение дважды»

Вот код:.

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

#define handle_error_en(en, msg) \ 
       do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) 

void *thread_function(char *message) 
{ 
    int s, j, number; 
    pthread_t thread; 
    cpu_set_t cpuset; 

    number = (int)message; 
    thread = pthread_self();  
    CPU_SET(number, &cpuset); 

    s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset); 
    if (s != 0) 
    { 
     handle_error_en(s, "pthread_setaffinity_np"); 
    } 

    printf("Thread %d is running on CPU %d\n", number, sched_getcpu()); 

    exit(EXIT_SUCCESS); 
} 

int main() 
{ 
    pthread_t thread1, thread2, thread3, thread4; 
    int thread1Num = 1; 
    int thread2Num = 2; 
    int thread3Num = 3; 
    int thread4Num = 4; 
    int thread1Create, thread2Create, thread3Create, thread4Create, i, temp; 

    thread1Create = pthread_create(&thread1, NULL, (void *)thread_function, (char *)thread1Num); 
    thread2Create = pthread_create(&thread2, NULL, (void *)thread_function, (char *)thread2Num); 
    thread3Create = pthread_create(&thread3, NULL, (void *)thread_function, (char *)thread3Num); 
    thread4Create = pthread_create(&thread4, NULL, (void *)thread_function, (char *)thread4Num); 

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

    return 0; 
} 

ответ

2

Первый процессор CPU 0 не CPU 1 Так вы хотите, чтобы изменить threadNums :

int thread1Num = 0; 
int thread2Num = 1; 
int thread3Num = 2; 
int thread4Num = 3; 

Вы должны инициализировать cpuset с CPU_ZERO() макрос так:

CPU_ZERO(&cpuset); 
CPU_SET(number, &cpuset); 

Также не называют выход() из потока, как это будет остановить весь процесс со всеми его нитями:

 

            
 
  
             exit(EXIT_SUCCESS);
            
  
return 0; // Use this instead or call pthread_exit() 
+0

Спасибо, я постараюсь это через пару часов :) – hahuang65

+0

Высокие :) Большое спасибо. – hahuang65

Смежные вопросы