如何将本地结构作为参数传递给pthread_create?

时间:2016-07-28 15:26:12

标签: c linux pointers scope pthreads

以下功能无效。 pin_thread_function有时会收到垃圾而不是结构数据。怎么了?我知道这是一个基本的范围相关问题,但我无法解释。

typedef void (*state_callback_t)(int state);

struct pin_thread_params
{
    char pin[3 + 1];
    state_callback_t callback_onchange;
};

extern int pin_monitor_create(const char * pin,
        state_callback_t callback_onchange)
{
    int ret;
    unsigned long int thread;
    struct pin_thread_params params;

    //Setup struct
    strcpy(params.pin, "123");
    params.callback_onchange = callback_onchange;

    //Create thread with struc as parameter
    ret = pthread_create(&thread, NULL, pin_thread_function, &params);
    if (!ret)
    {
        ret = pthread_detach(thread);
    }

    return ret;
}

static void * pin_thread_function(void * context)
{
    struct pin_thread_params params;
    memcpy(&params, context, sizeof(params));

    //Sometimes the correct string, most time garbage 
    printf("Started monitoring %s", params.pin);
}

当params在pthread_create之前被malloc编辑时,一切正常,就像这样:

...
    struct pin_thread_params * params;

    //Setup struct with malloc
    params = malloc(sizeof(struct pin_thread_params));
    strcpy(params->pin, "123");
    params->callback_onchange = callback_onchange;
...

2 个答案:

答案 0 :(得分:3)

struct pin_thread_params params是静态分配的,一旦其范围结束(即在pin_monitor_create返回后),其地址可安全使用。有时线程执行可能会在pin_monitor_create退出之前开始,并且您在params中看到有效数据。但是,动态分配的内存来自堆,并且在您释放之前可以使用,因此您始终可以在paramspin_thread_function内获得有效数据。

答案 1 :(得分:2)

我对pthreads并不是特别了解(不能只是评论),但是你传递一个指向堆栈分配的内存的指针到线程,最终会被进行的函数调用破坏。