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);
}
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
@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ỉ. –