2011-08-09 12 views
14

Tworzę plik c dla kolejki wysyłkowej, która pobiera zadanie i umieszcza go w kolejce, która jest połączoną listą. Aby to zrobić, trzeba utworzyć wątki używającC, jak utworzyć wątek przy użyciu funkcji pthread_create

pthread_t cThread; 
if(pthread_create(&cThread, NULL, work, param)){ 
    perror("ERROR creating thread."); 
} 

Jednak muszę zrobić inną funkcję, że idzie do pracy „” i „param” zmiennej jako parametry funkcji tworzenia. Mój przyjaciel powiedział mi, że po prostu muszę wstawić dowolny kod do funkcji roboczej, który pętli w nieskończoność, więc wątek nie umiera .. Czy każdy może wyjaśnić każdy parametr idzie do funkcji pthread_create - zwłaszcza dla work i param? Szukałem w Google, ale większość samouczki są tak trudne do zrozumienia pojęcia ...

+0

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_create.html – miku

+0

Tak, czytam to. Chcę tylko, żeby ktoś wyjaśnił mi w zdaniach - jaki jest każdy parametr dla – Leanne

Odpowiedz

23

Cztery parametry do pthread_create są w kolejności:

  1. Wskaźnik do pthread_t struktury, które pthread_create wypełni się informacjami na temat tworzonego wątku.

  2. Wskaźnik do pthread_attr_t z parametrami dla wątku. Przez większość czasu możesz bezpiecznie przesyłać tylko NULL.

  3. Funkcja do uruchamiania w wątku. Funkcja musi zwrócić wartość void * i przyjąć argument o wartości void *, który możesz użyć, ale uważasz, że pasuje. (Na przykład, jeśli uruchamiasz wiele wątków z tą samą funkcją, możesz użyć tego parametru, aby je rozróżnić.)

  4. The void *, od którego chcesz rozpocząć wątek. Przekaż NULL, jeśli go nie potrzebujesz.

16

wyjaśnieniu duskwuff za odpowiedź:

work parametrem jest wskaźnik funkcji. Funkcja powinna przyjąć jeden argument oznaczony jako typ void * i zwrócić wartość void *.

param ma być wskaźnikiem do danych, które otrzyma work.

Jako przykład, powiedzmy, że chcesz przekazać dwa int do pracownika. Następnie można stworzyć coś takiego:

int *param = (int *)malloc(2 * sizeof(int)); 
param[0] = 123; 
param[1] = 456; 
pthread_create(&cThread, NULL, work, param); 

następnie czynność praca może konwertować typ wskaźnika, a także pobrać dane param:

void *work(void * parm) { 
    int *param = (int *)parm; 
    int first_val = param[0]; 
    .... 
} 

Można zrobić bardziej złożonych rzeczy, na przykład tworząc struct z wszystkie dane, które musisz przekazać.

+6

Proszę nie rzutować zwracanych wartości z 'malloc'. Jego powrót jest 'void *' i zawsze można go przypisać do dowolnego wskaźnika danych. To samo dotyczy 'parm'. –

+0

@Jen zły nawyk od C++: / –

Powiązane problemy