2008-12-02 11 views
6

Czy możesz mi powiedzieć, w jaki sposób mogę używać wątków w programach w C++ i jak mogę je skompilować, ponieważ będą one wielowątkowe? Czy możesz mi powiedzieć jakąś dobrą stronę, na której mogę zacząć od roota?Używanie wątków w C++

Dzięki

+0

zrobiłem EDIT, aby moją odpowiedź po rozmowie z moim prof o dzielenie się swoją bibliotekę tutaj. – caglarozdag

Odpowiedz

0

You may want to read my earlier posting on SO.

(Z perspektywy czasu, że wpis jest trochę jednostronna kierunku pthreads. Ale jestem pewien rodzaj Unix/Linux z facetem. I to podejście wydawało się najlepiej w odniesieniu do oryginalny temat.)

1

Używam biblioteki, którą napisał mój uniwersytet. Jest bardzo prosty w implementacji i działa naprawdę dobrze (używał go od dłuższego czasu). Poproszę go o pozwolenie, aby podzielić się nim z tobą.

przepraszam za czekać na prowadzenie, ale muszę sprawdzić :)

++++++ EDIT +++++++

Ok, więc rozmawiałam z moim prof a on nie ma nic przeciwko temu, gdybym udostępnić go tutaj. Poniżej znajdują się pliki .cpp i .h dla „RT Library” napisany przez Paula Daviesa

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

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

Niektóre punkty mają być wykonane o wątkach i korzystanie z tej biblioteki:

0) Ten samouczek objaśni tworzenie i używanie wątków na platformie Windows.

1) Nitki C++ są zazwyczaj kodowane w ramach tego samego źródła (w przeciwieństwie do procesów, w których każdy proces posiada własny plik źródłowy i główną funkcją())

2) Gdy proces jest uruchomiony, może tworzyć inne wątki, wykonując odpowiednie wywołania jądra.

3) Wiele wątków działa szybciej niż wiele procesów, ponieważ są one częścią tego samego procesu, co powoduje mniejsze obciążenie systemu operacyjnego i mniejsze wymagania dotyczące pamięci.

4) W twoim przypadku użyjesz klasy CThread w bibliotece rt.

5) (Upewnij się, że rt.h i rt.cpp są częścią twojego "rozwiązania" i upewnij się, że dołączasz rt.h do swojej głównej.cpp)

6) Poniżej znajduje się fragment kodu z przyszłego wątku głównego (oczywiście w main.cpp), w którym utworzymy wątek za pomocą klasy CThread.

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

} 

Argumenty t1 w kolejności są: nazwa funkcji, działając jako naszego wątku, status gwint (to może być aktywne lub zawieszone - w zależności od tego, co chcesz), a ostatni wskaźnik do opcjonalnie dane, które możesz przesłać do wątku podczas tworzenia. Po wykonaniu jakiegoś kodu, będziesz chciał wywołać funkcję WaitForThread().

7) Poniżej znajduje się fragment kodu z przyszłego wątku głównego (oczywiście w pliku main.cpp), gdzie można opisać, co robi wątek podrzędny.

UINT _ _stdcall ChildThread1(void *args)  
{ 

    . . .   
} 

Dziwnie wyglądającą rzeczą jest sygnatura wątku Microsoftu. Jestem pewien, że przy odrobinie badań możesz dowiedzieć się, jak to zrobić w innych systemach operacyjnych. Argumentem są opcjonalne dane, które można przekazać dziecku podczas tworzenia.

8) Szczegółowe opisy funkcji członków można znaleźć w pliku rt.cpp. Oto podsumowanie:

CThread() - Konstruktor odpowiedzialny za tworzenie nici

wstrzymania() - Zawiesza wątek dziecko skutecznie zatrzymując go.

Resume() - budzi się w zawieszeniu wątek dziecko

SetPriority (int value) - zmienia priorytet wątku dziecka do wartości określonym

post (int wiadomość) - Słupy wiadomość do wątek dziecko

TerminateThread() - likwiduje lub zabija gwint dziecko

WaitForThread() - Wstrzymuje gwint główne, nitki dzieci zostaje zakończony. Jeśli wątek podrzędny został już zakończony, element nadrzędny nie wstrzyma się:

9) Poniżej znajduje się przykładowy przykładowy kompletny program. Sprytną rzeczą, którą możesz zrobić, jest utworzenie wielu wystąpień pojedynczego wątku.

#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) To wszystko! Biblioteka rt zawiera kilka klas, które umożliwiają pracę z procesami i wątkami oraz innymi współbieżnymi technikami programowania. Odkryj resztę;)

3

Używam klasy tbb_thread z biblioteki Intel Threading biblioteki klocków.

+0

Używam również tbb, good stuff –

1

Istnieje wiele bibliotek wątków, które są kompatybilne z C++. Najpierw musisz wybrać jedną. Preferuję wątki OpenMP lub POSIX (znane również jako pthreads). Sposób kompilacji zależy od wybranej biblioteki.

0

Wykorzystanie wątków w 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; 
}