2010-04-02 13 views
1

J'ai réussi à faire fonctionner mon programme pthreads. Fondamentalement, j'essaie de définir manuellement l'affinité de 4 threads de telle sorte que thread 1 s'exécute sur CPU 1, thread 2 s'exécute sur CPU 2, thread 3 s'exécute sur CPU 3, et thread 4 fonctionne sur CPU 4.pthreads_setaffinity_np: Argument invalide?

Après la compilation, Mon code fonctionne pour quelques threads mais pas pour d'autres (il semble que le thread 1 ne fonctionne jamais) mais exécuter le même programme compilé à plusieurs reprises me donne des résultats différents.

Par exemple:
hao @ Gorax: ~/Bureau $ ./a.out
fil 3 est en cours d'exécution sur le processeur 3
pthread_setaffinity_np: Invalid argument
Discussion Thread 2 est en cours d'exécution sur le processeur 2
hao @Gorax: ~/bureau $ ./a.out
discussion 2 est en cours d'exécution sur le processeur 2
pthread_setaffinity_np: Invalid argument
pthread_setaffinity_np: Invalid argument
fil 3 est en cours d'exécution sur le processeur 3
Discussion 3 est en cours d'exécution sur le processeur 3
hao @ Gorax: ~/Bureau $ ./a.out
Discussion 2 est en cours d'exécution sur le processeur 2
pthread_setaffinity_np: Invalid argument
Sujet 4 est en cours d'exécution sur le processeur 4
discussion 4 est en cours d'exécution sur le processeur 4
hao @ Gorax: ~/bureau $ ./a.out
pthread_setaffinity_np: Invalid argument

Ma question est « Pourquoi cela? En outre, pourquoi le message parfois imprimer deux fois »

Voici le code:.

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

Répondre

2

La première CPU est CPU 0 pas CPU 1 Vous aurez envie de changer vos threadNums :

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

Vous devez initialiser cpuset avec la macro de cette façon CPU_ZERO():

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

Aussi ne pas appeler exit() à partir d'un fil car il arrêtera le processus avec tous ses fils:

 

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

Merci, je vais essayer en quelques heures :) :) Impressionnant – hahuang65

+0

Merci beaucoup. – hahuang65