2010-06-04 32 views
6

Tôi vừa bắt đầu học pthreads API và tôi đang theo hướng dẫn hereCó hợp pháp để vượt qua một đối số là void * không?

Tuy nhiên, trong một chương trình ví dụ về pthread_create, chương trình mẫu tạo ra một biến dài và đi giá trị của nó, typecasted như void*. Trong chức năng nhập chủ đề, nó dereferences nó giống như một thời gian dài.

Đây có phải là hợp pháp không? Tôi hiểu rằng nếu tôi chuyển địa chỉ biến số t, mỗi chuỗi sẽ hoạt động trên cùng một biến và không phải trên bản sao của biến đó. Chúng tôi có thể làm điều này bởi vì nó là một void* và trình biên dịch không có ý tưởng về loại chúng tôi đang gửi?

#include <pthread.h> 
#include <stdio.h> 

#define NUM_THREADS  5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    printf("Hello World! It's me, thread #%ld!\n", tid); 
    pthread_exit(NULL); 
} 

int main (int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    long t; 
    for(t=0; t<NUM_THREADS; t++){ 
     printf("In main: creating thread %ld\n", t); 
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 
     if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
     } 
    } 
    pthread_exit(NULL); 
} 
+0

Vì vậy, câu hỏi của bạn là về tính hợp lệ của tính năng truyền hoặc hiệu lực của con trỏ đi qua làm đối số thứ tư cho pthread_create()? – qrdl

+0

@qrdl: thực sự là cả hai nhưng tôi đã quan tâm nhiều hơn trong việc vượt qua lâu như đối số thứ tư cho pthread_create làm cho complier nghĩ rằng bạn đang thực sự gửi một địa chỉ. –

Trả lời

4

Điều này hoạt động miễn là sizeof(long) <= sizeof(void*) và mọi giá trị của long có thể được biểu diễn dưới dạng void*.

Tốt hơn là chuyển địa chỉ của biến. Bạn có thể truyền từ một số T* đến void* và quay lại một cách an toàn mà không cần giả định.

+1

@Charles 'sizeof (void)' và 'sizeof (void *)' là những con thú khác nhau – qrdl

+0

@qrdl: Đúng vậy! –

4

Nó hợp pháp như bất kỳ loại kiểu chữ nào. Vấn đề là không có gì có thể được thực hiện với giá trị mà đối số trỏ đến, cho đến khi nó được định kiểu, do đó tid = (long)threadid.

Kiểm tra cũ hơn Q & A When to use a void pointer?.

+0

Bạn đang nói, 'void *' có nghĩa là "con trỏ đến cái gì đó", nhưng "cái gì đó" cần được xác định trước khi nó có thể được sử dụng, phải không? – Abel

+0

@Abel: đúng. Vấn đề là khi bạn muốn làm điều gì đó với một con trỏ không thể đưa ra thông tin kiểu. –

Các vấn đề liên quan