2008-12-02 40 views
6

¿Puede decirme cómo puedo usar hilos en programas C++, y cómo puedo compilarlo ya que será multiproceso? ¿Me puede decir algún buen sitio donde puedo comenzar desde la raíz?Uso de hilos en C++

Gracias

+0

me hizo la edición en mi respuesta después de hablar con mi prof de compartir su biblioteca aquí. – caglarozdag

Respuesta

0

You may want to read my earlier posting on SO.

(En retrospectiva, que la publicación es un poco de un solo lado hacia pthreads. Pero yo soy un tipo Unix/Linux del chico. Y ese enfoque parecía mejor con respecto a la tema original.)

1

Uso una biblioteca que escribió mi profesor universitario. Es muy simple de implementar y funciona muy bien (lo usé desde hace bastante tiempo). Le pediré su permiso para compartirlo con usted.

Lo siento por la espera por delante, pero tengo cheque :)

++++++ EDITAR +++++++

Ok, así que hablé con mi prof y que no le importa si tú aquí. A continuación se presentan los archivos .h .cpp para el 'RT Biblioteca', escrito por Paul Davies

http://www.filefactory.com/file/7efbeb/n/rt_h

http://www.filefactory.com/file/40d9a6/n/rt_cpp

Algunos puntos que se hacen sobre los hilos y el uso de esta biblioteca:

0) Este tutorial explicará la creación de subprocesos y su uso en una plataforma de Windows.

1) Temas en C++ generalmente se codifican como parte de la misma fuente (a diferencia de procesos en los que cada proceso tiene su propio archivo de fuente y la función principal())

2) Cuando un proceso está en funcionamiento, puede crear otros hilos haciendo llamadas Kernel apropiadas.

3) Los subprocesos múltiples se ejecutan más rápido que los procesos múltiples, ya que son parte del mismo proceso que se traduce en una menor sobrecarga para el sistema operativo y requisitos de memoria reducidos.

4) Lo que va a utilizar en su caso es la clase CThread en la biblioteca rt.

5) (Asegúrate de que rt.h y rt.cpp son parte de tu 'solución' y asegúrate de incluir rt.h en tu main.cpp)

6) A continuación se muestra una parte del código de su hilo principal futuro (en main.cpp, por supuesto) donde se creará el hilo utilizando la clase CThread.

void main() 
{ 
    CThread t1(ChildThread1, ACTIVE, NULL) ;  
    . . . 
    t1.WaitForThread() ;    // if thread already dead, then proceed, otherwise wait 

} 

Los argumentos de t1 en orden son: Nombre de la función de actuar como nuestro hilo, el estado del hilo (que puede ser activo o suspendido - dependiendo de lo que quiere), y por último, un puntero a una datos opcionales es posible que desee pasar a la secuencia en la creación. Después de ejecutar algún código, querrá llamar a la función WaitForThread().

7) A continuación se muestra una parte del código de su hilo principal futuro (en main.cpp, por supuesto) donde se describirá lo que hace el hilo hijo.

UINT _ _stdcall ChildThread1(void *args)  
{ 

    . . .   
} 

Lo que parece extraño es la firma de hilos de Microsoft. Estoy seguro de que con un poco de investigación podrás descubrir cómo hacerlo en otros sistemas operativos. El argumento es la información opcional que podría pasarse al niño en la creación.

8) Puede encontrar las descripciones detalladas de las funciones miembro en el archivo rt.cpp. Aquí están los resúmenes:

CThread() - El constructor responsable de crear el hilo

de suspender() - suspende a un hilo hijo pausa real en ella.

Reanudar() - Se despierta un hilo hijo suspendida

SetPriority (int value) - Cambia la prioridad de un hilo hijo al valor especifica

mensaje (mensaje int) - se enviará un mensaje a un hilo hijo

TerminateThread() - termina o mata a un hilo hijo

WaitForThread() - Pausa el hilo padre hasta un hilo hijo termina. Si el subproceso secundario ya ha finalizado, el elemento primario no pausará

9) A continuación se muestra un ejemplo de un programa completo de muestra. Una cosa inteligente que puede hacer es crear múltiples instancias de un solo hilo.

#include “..\wherever\it\is\rt.h” //notice the windows notation 

    int  ThreadNum[8] = {0,1,2,3,4,5,6,7} ; // an array of thread numbers 


    UINT _ _stdcall ChildThread (void *args) // A thread function 
    { 
     MyThreadNumber = *(int *)(args);  

     for (int i = 0; i < 100; i ++) 
      printf("I am the Child thread: My thread number is [%d] \n", MyThreadNumber) ; 

     return 0 ; 
    } 
int  main() 
{ 
    CThread  *Threads[8] ; 

// Create 8 instances of the above thread code and let each thread know which number it is. 


    for (int i = 0; i < 8; i ++) { 
     printf ("Parent Thread: Creating Child Thread %d in Active State\n", i) ; 
     Threads[i] = new CThread (ChildThread, ACTIVE, &ThreadNum[i]) ; 
    } 

    // wait for threads to terminate, then delete thread objects we created above 

    for(i = 0; i < 8; i ++) { 
     Threads[i]->WaitForThread() ; 
    delete Threads[i] ; // delete the object created by ‘new’ 
    } 
    return 0 ; 
} 

10) Eso es todo! La biblioteca rt incluye varias clases que le permiten trabajar con procesos e hilos y otras técnicas de programación simultáneas. Descubra el resto;)

3

Utilizo la clase tbb_thread de la biblioteca intel threading building blocks.

+0

También uso tbb, cosas buenas –

1

Hay muchas bibliotecas de hilos que son compatibles con C++. Entonces al principio debes seleccionar uno. Prefiero OpenMP o hilos POSIX (también conocidos como pthreads). Cómo compilarlo depende de la biblioteca que elijas.

0

uso de hilos en C/C++:

#include <iostream> 

using namespace std; 

extern "C" 
{ 
    #include <stdlib.h> 
    #include <pthread.h> 
    void *print_message_function(void *ptr); 
} 


int main() 
{ 
    pthread_t thread1, thread2; 
    char *message1 = "Thread 1"; 
    char *message2 = "Thread 2"; 
    int iret1, iret2; 

    iret1 = pthread_create(&thread1, NULL, print_message_function (void*) message1); 
    iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2); 

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

    //printf("Thread 1 returns: %d\n",iret1); 
    //printf("Thread 2 returns: %d\n",iret2); 
    cout<<"Thread 1 returns: %d\n"<<iret1; 
    cout<<"Thread 2 returns: %d\n"<<iret2; 

    exit(0); 
} 

void *print_message_function(void *ptr) 
{ 
    char *message; 
    message = (char *) ptr; 
    //printf("%s \n", message); 
    cout<<"%s"<<message; 
}