我正在处理一个项目,它要求我使用void指针存储对pthread的所有引用,并使用包装函数创建和取消这些线程。
因此我得到了以下结论:
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?我很困惑......
答案 0 :(得分:4)
这是一个很大的问题(来自您的createThread
函数):
pthread_t thread;
...
*handle = &thread;
在此,您*handle
指向本地变量thread
。但请记住,当函数返回时thread
将超出范围,并且指针将不再有效。当您稍后尝试使用此无效指针时,这将导致未定义的行为。
我的建议是,您跳过ThreadHandle_t
类型,只需从pthread_t
函数返回createThread
(不是指针),并将其原样传递给函数需要它。
答案 1 :(得分:2)
您的pthread是createThread中的局部变量。这是错的。使其成为全局或在主函数中定义。
createThread返回后,你的句柄指向什么。