如何将本地结构作为参数传递给 pthread_create?
How to pass a local struct as parameter to pthread_create?
以下功能不起作用。 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, ¶ms);
if (!ret)
{
ret = pthread_detach(thread);
}
return ret;
}
static void * pin_thread_function(void * context)
{
struct pin_thread_params params;
memcpy(¶ms, 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;
...
我对 pthreads 不是特别了解(还不能完全发表评论),但是您正在将指向堆栈分配内存的指针传递给线程,该线程最终将被函数调用破坏。
struct pin_thread_params params
是静态分配的,一旦它的范围结束(即在 pin_monitor_create
返回后),它的地址 不 可以安全使用).有时可能会发生线程执行在 pin_monitor_create
退出之前开始并且您在 params
中看到有效数据的情况。但是,动态分配的内存来自堆,并且在您释放它之前一直可用,因此您总是在 pin_thread_function
内的 params
中获得有效数据。
以下功能不起作用。 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, ¶ms);
if (!ret)
{
ret = pthread_detach(thread);
}
return ret;
}
static void * pin_thread_function(void * context)
{
struct pin_thread_params params;
memcpy(¶ms, 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;
...
我对 pthreads 不是特别了解(还不能完全发表评论),但是您正在将指向堆栈分配内存的指针传递给线程,该线程最终将被函数调用破坏。
struct pin_thread_params params
是静态分配的,一旦它的范围结束(即在 pin_monitor_create
返回后),它的地址 不 可以安全使用).有时可能会发生线程执行在 pin_monitor_create
退出之前开始并且您在 params
中看到有效数据的情况。但是,动态分配的内存来自堆,并且在您释放它之前一直可用,因此您总是在 pin_thread_function
内的 params
中获得有效数据。