2011-11-22 15 views
8

Próbuję przekazać dwa parametry do wątku w C. Stworzyłem tablicę (o rozmiarze 2) i próbuję przekazać tę tablicę do wątku. Czy jest to właściwe podejście do przekazywania wielu parametrów do wątku?Jak przekazać wiele parametrów do wątku w C

// parameters of input. These are two random numbers 
int track_no = rand()%15; // getting the track number for the thread 
int number = rand()%20 + 1; // this represents the work that needs to be done 
int *parameters[2]; 
parameters[0]=track_no; 
parameters[1]=number; 

// the thread is created here 
pthread_t server_thread; 
int server_thread_status; 
//somehow pass two parameters into the thread 
server_thread_status = pthread_create(&server_thread, NULL, disk_access, parameters); 
+1

Sprawdź swój kod deklarują tablicę wskaźników na int i przypisanie ich wartości int. – Teudimundo

+0

Zauważyłem to ostrzeżenie. Czy byłoby uzasadnione, gdyby parametry nie były wskaźnikami i po prostu tablicą? –

+0

jeśli zadeklarujesz parametr jako tablicę int ("int parameter [2];"), możesz przekazać parametr jako wskaźnik. Jest to wskaźnik do pierwszej int. Możesz wtedy uzyskać do niego dostęp z wątku jako tablicę. – Teudimundo

Odpowiedz

15

Ponieważ przechodzą w pustce wskaźnika, może to wskazywać na cokolwiek, w tym struktury, jak na poniższym przykład:

typedef struct s_xyzzy { 
    int num; 
    char name[20]; 
    float secret; 
} xyzzy; 

xyzzy plugh; 
plugh.num = 42; 
strcpy (plugh.name, "paxdiablo"); 
plugh.secret = 3.141592653589; 

status = pthread_create (&server_thread, NULL, disk_access, &plugh); 
// pthread_join down here somewhere to ensure plugh 
// stay in scope while server_thread is using it. 
+3

Oczywiście, w kodzie, jak pokazano w powyższym przykładzie, musisz upewnić się, że struktura nie zostanie zniszczona, podczas gdy wątek próbuje dereferencji danego opintera. –

+0

Najprostszym rozwiązaniem jest "malloc" struktury i uczynienie nowego wątku odpowiedzialnym za uwolnienie go. Innym podejściem jest umieszczenie bariery wewnątrz struktury i posiadanie zarówno oryginalnej, jak i nowej nitki czeka na barierę przed powrotem pierwotnego wątku. –

+0

@FrerichRaabe Może głupie pytanie, ale w jaki sposób struktura "zostaje zniszczona" ... inna niż wywołanie 'free()' (jeśli to było 'malloc'ed) lub funkcja powracająca (jeśli została przydzielona stos), czy istnieje jakakolwiek inna metoda? – The111

1

To jeden sposób. Drugim typem jest przekazanie wskaźnika do struct. W ten sposób możesz mieć różne typy "parametrów", a parametry są nazywane, a nie indeksowane, co może sprawić, że kod będzie nieco łatwiejszy do odczytania/śledzenia.

Powiązane problemy