我正在处理一个项目,该项目需要我使用void指针存储对pthread的所有引用,并使用包装函数创建并取消这些线程。pthread_cancel()在传入类型转换void pointer时不起作用
因此我结束了以下内容:
typedef void * ThreadHandle_t;
void * endlessWhileLoop(void * p){
while(1);
}
int createThread(ThreadHandle_t * handle){
pthread_t thread;
int ret = pthread_create(&(thread), NULL, endlessWhileLoop, NULL);
if (ret != 0) {
return -1;
}
/* Configure the ThreadHandle to point to the task */
if (handle != NULL) { /* If handle was passed in */
*handle = &thread;
}
//ret = pthread_cancel(*(pthread_t *)*handle); <--This works
return ret;
}
int deleteThread(ThreadHandle_t handle){
int ret = pthread_cancel(*(pthread_t *)handle);
if(ret != 0){
printf("Failed to delete task, return code: %d", ret);
return -1;
}
return ret;
}
int main(void){
ThreadHandle_t temp = 0;
createThread(&temp);
deleteThread(temp);
}
不过,我收到找不到错误在deleteThread的cancel_thread调用线程。
如果我将pthread_cancel调用转移到createThread函数中,即使在使用ThreadHandle的情况下,它也可以工作,并且线程被取消。
难道我没有通过正确的引用传递使用ThreadHandle_t的pthread_t吗?我很迷惑......
你的逻辑真的没有任何意义。由于'temp'是一个指向void的指针,你将不得不使用它来指向'pthread_t'。但是你在哪里分配任何'pthread_t'来指向? –