如何显式类型转换指针



我正在尝试声明一个数据类型为 int 的变量指针,以存储线程 ID (即 myid),然后将其设置为等于显式类型转换为参数 vargp 的整数指针。但是,当我尝试输出 ID 号时,我得到的是一个地址,而不是实际值。for 循环应该为 LOOP 迭代运行。以下是我到目前为止对上一个声明的内容。int *myid = (int *)vargp;这是函数的其余部分。

void* threadFunction(void *vargp) {
int LOOP = 0;
unsigned long i = 0;
int *myid = (int*) vargp;
printf("n-----------------------------n");
printf("nThread %d has startedn", *myid);
printf("n-----------------------------n");
while (LOOP <= 5) {
printf("nThread ID %d is printing iteration %d", *myid, LOOP);
LOOP++;
}
printf("nThread %d has finishedn", *myid);
return NULL;
}

我得到应该Thread ID -136702208 is printing iteration 0Thread ID 1 is printing iteration 0我该如何解决这个问题?

下面是调用线程函数的函数。

void multiThreads() {
int SIZE = 5;
int i = 0;
int error;
pthread_t tid[SIZE];
for (i = 0; i < SIZE; i++) {
error = pthread_create(&(tid[i]), NULL, threadFunction, (void*) &(tid[i]));
if (error != 0) {
printf("nThread can't be created : [%s]", strerror(error));
}
} //end for
while (i < SIZE) {
pthread_join(tid[i], NULL);
i++;
}
}

由于pthread_t的内容未定义,我tid更改为包含所需pthread_t t和数字id值的struct。 初始化 id 并将id的地址作为 arg 传入。 将 SIZE 更改为大小,因为大写通常适用于您定义的值。 使用main()而不是multiThreads()来驱动未更改的threadFunction()

int main() {
int size = 5;
struct {
pthread_t t;
int id;
} threads[size];
for(unsigned i=0; i < size; i++){
threads[i].id = i + 1;
int error = pthread_create(&threads[i].t, NULL, threadFunction, &threads[i].id);
if(error) {
printf("nThread can't be created : [%s]", strerror(error));
}
}
for(unsigned i = 0; i < size; i++) {
pthread_join(threads[i].t, NULL);
}
return 0;
}

这里是输出的片段:

                                                 
-----------------------------                                                                                          
                                                 
Thread 1 has started                                                                                                   
                                                 
-----------------------------                                                                                          

Thread ID 1 is printing iteration 0                                                                                    
Thread ID 1 is printing iteration 1                       
Thread ID 1 is printing iteration 2                   
Thread ID 1 is printing iteration 3                        
Thread ID 1 is printing iteration 4                                                                                    
Thread ID 1 is printing iteration 5                 
Thread 1 has finished                                      
                                                 
-----------------------------                                                                                          

Thread 5 has started                                       
                                                 
-----------------------------                                                                                          
                                                 
Thread ID 5 is printing iteration 0                       
Thread ID 5 is printing iteration 1                                                                                    
Thread ID 5 is printing iteration 2                                                                                    
Thread ID 5 is printing iteration 3                                                                                    
Thread ID 5 is printing iteration 4                 
Thread ID 5 is printing iteration 5                  
Thread 5 has finished                                                                                                  
                                                 
-----------------------------                         
                                                 
Thread 3 has started                                       

-----------------------------             

Thread 4 has started                                       

-----------------------------                              

Thread ID 4 is printing iteration 0
Thread ID 4 is printing iteration 1                                                                                    
Thread ID 4 is printing iteration 2                    
Thread ID 4 is printing iteration 3                                                                                    

最新更新