2009-09-11 6 views
5

Ciao a tutti, considerando il seguente codice (compilato con g++ -lpthread thread_test.cpp) come posso sapere qual è il numero di thread in cui sono dentro "thread_function"? E fammi sapere se hai altri suggerimenti.pthread in una classe

Grazie!

thread_test.cpp:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

class A { 
    public: 
     A(); 
     void run(); 

    private: 
     static void* thread_function(void *ptr); 
     pthread_t m_thread1, m_thread2; 

     static int m_global; 
}; 

int A::m_global = 0; 

A::A() { 
    int ret1 = pthread_create(&m_thread1, NULL, &A::thread_function, this); 
    int ret2 = pthread_create(&m_thread2, NULL, &A::thread_function, this); 
} 

void A::run() { 
    while (1) { 
     printf("parent incrementing...\n"); 
     m_global++; 
     sleep(2); 
    } 
} 

void* A::thread_function(void *ptr) { 
    printf("I'm thread ?\n"); 

    while (1) { 
     printf("thread global: %d\n", m_global); 
     sleep(1); 
    } 
} 

int main() { 
    A a; 
    a.run(); 

    return 0; 
} 

risposta

3

È possibile utilizzare la funzione pthread_self().

+0

ok vedo che ora ... dovrei usare qualcosa come pthread_key_create per memorizzare qualche tipo di dati specifici del thread al suo interno per identificare se è il thread 1 o 2? Sto cercando di capire se pthread_key_create è davvero quello che voglio ... –

+0

Puoi usare una variabile specifica del thread ma non penso sia necessario. Basta chiamare pthread_self() ogni volta che si desidera utilizzare il numero di thread corrente. – danadam

+0

Come si usa un 'pthread_t' come numero? –

1

Beh, ho capito che potevo farlo, ma non sono sicuro che rendere statiche le variabili pthread_t sia la cosa migliore da fare. Opinioni?

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

class A { 
    public: 
     A(); 
     void run(); 

    private: 
     static void* thread_function(void *ptr); 
     static pthread_t m_thread1, m_thread2; 

     static int m_global; 
}; 

int A::m_global = 0; 
pthread_t A::m_thread1 = 0; 
pthread_t A::m_thread2 = 0; 

A::A() { 
    int ret1 = pthread_create(&m_thread1, NULL, &A::thread_function, this); 
    int ret2 = pthread_create(&m_thread2, NULL, &A::thread_function, this); 
} 

void A::run() { 
    while (1) { 
     printf("parent incrementing...\n"); 
     m_global++; 
     sleep(2); 
    } 
} 

void* A::thread_function(void *ptr) { 
    int thread_num = 0; 
    if (pthread_self() == m_thread1) { 
     thread_num = 1; 
    } else { 
     thread_num = 2; 
    } 

    printf("I'm thread %d\n", thread_num); 

    while (1) { 
     printf("thread %d global: %d\n", thread_num, m_global); 
     sleep(1); 
    } 
} 

int main() { 
    A a; 
    a.run(); 

    return 0; 
} 
+1

Non è possibile confrontare pthread_t in questo modo. Devi * usare * pthread_equal. –

1

La risposta corretta dipende fortemente dal motivo per cui sono necessarie queste informazioni. Se i due thread stanno facendo cose diverse, perché hanno la stessa funzione di avvio?

Una soluzione semplice è questa:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

class A { 
    public: 
     A(); 
     void run(); 

    private: 
     static void* thread_function(void *ptr, int which); 
     static void* thread_function_1(void *ptr); 
     static void* thread_function_2(void *ptr); 
     pthread_t m_thread1, m_thread2; 

     static int m_global; 
}; 

int A::m_global = 0; 

A::A() { 
    int ret1 = pthread_create(&m_thread1, NULL, &A::thread_function_1, this); 
    int ret2 = pthread_create(&m_thread2, NULL, &A::thread_function_2, this); 
} 

void A::run() { 
    while (1) { 
     printf("parent incrementing...\n"); 
     m_global++; 
     sleep(2); 
    } 
} 

void* A::thread_function_1(void *ptr) { thread_function(ptr, 1); } 
void* A::thread_function_2(void *ptr) { thread_function(ptr, 2); } 

void* A::thread_function(void *ptr, int which) { 
    printf("I'm thread %d\n", which); 

    while (1) { 
     printf("thread global: %d\n", m_global); 
     sleep(1); 
    } 
} 

int main() { 
    A a; 
    a.run(); 

    return 0; 
} 

Se si dispone di più di 2 fili, è possibile utilizzare un altro approccio. Crea una struttura che contenga tutte le informazioni di cui ha bisogno il thread, incluso il puntatore this e quale thread è. Assegna una struttura di quel tipo, inseriscile con tutto ciò di cui ha bisogno il thread e passa al thread attraverso la funzione pthread_create invece del solo puntatore this.