传递类型转换的void指针

时间:2017-01-23 08:29:54

标签: c multithreading pthreads void-pointers

我正在处理一个项目,它要求我使用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?我很困惑......

2 个答案:

答案 0 :(得分:4)

这是一个很大的问题(来自您的createThread函数):

pthread_t thread;
...
*handle = &thread;

在此,您*handle指向本地变量thread。但请记住,当函数返回时thread将超出范围,并且指针将不再有效。当您稍后尝试使用此无效指针时,这将导致未定义的行为

我的建议是,您跳过ThreadHandle_t类型,只需从pthread_t函数返回createThread(不是指针),并将其原样传递给函数需要它。

答案 1 :(得分:2)

您的pthread是createThread中的局部变量。这是错的。使其成为全局或在主函数中定义。

createThread返回后,你的句柄指向什么。