2009-09-11 16 views
5

Hola a todos, teniendo en cuenta el siguiente código (compilado con g++ -lpthread thread_test.cpp) ¿cómo puedo saber en qué número de subproceso estoy dentro de "thread_function"? Y avíseme si tiene alguna otra sugerencia.pthread en una clase

Gracias!

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

Respuesta

3

Puede utilizar la función pthread_self().

+0

ok veo que ahora ... ¿debería usar algo como pthread_key_create para almacenar algún tipo de datos específicos de hilos para identificar si es el hilo 1 o 2? Estoy tratando de averiguar si pthread_key_create es realmente lo que quiero ... –

+0

Puede usar una variable específica de subproceso, pero no creo que sea necesario. Simplemente llame a pthread_self() siempre que quiera usar el número de hilo actual. – danadam

+0

¿Cómo se usa 'pthread_t' como número? –

1

Bueno, descubrí que podía hacer esto, pero no estoy seguro de si hacer las variables pthread_t estáticas es lo mejor que se puede hacer. Opiniones?

#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

No se puede comparar pthread_t de esa manera. Usted * debe * usar pthread_equal. –

1

La respuesta correcta depende en gran medida de por qué necesita esta información. Si los dos hilos están haciendo cosas diferentes, ¿por qué tienen la misma función de inicio?

Una solución sencilla es la siguiente:

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

Si usted tiene más de 2 hilos, puede utilizar otro método. Cree una estructura que contenga toda la información que necesita el hilo, incluido el puntero this y qué hilo es. Asigne una estructura de ese tipo, llénela con todo lo que necesita el hilo y pásesela al hilo a través de la función pthread_create en lugar de solo el this puntero.