以下功能不起作用。 pin_thread_function
有時會收到垃圾,而不是結構數據。哪裏不對?我知道這是一些基本範圍相關的問題,但我無法解釋。如何將本地結構作爲參數傳遞給pthread_create?
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;
...
因此,'params'在'pthread_create'之後丟失。我幾乎可以肯定它只會在函數'pin_monitor_create'的末尾消失...... ;-(我是否遺漏了一些基本的範圍概念? – natenho
不,請再讀一遍他寫的東西,它在'pin_monitor_create '' –
@natenho它在'pthread_create'後不會丟失,它在'pin_monitor_create'之後丟失了,你不能直接控制線程調度器,如果主線程在'pin_thread_function'線程運行之前完成'pin_thread_create',垃圾數據如果你很幸運並且'pin_thread_function'線程在主線程完成之前執行,你會看到你的字符串,或者在多核芯片上,這2個線程真的可以並行運行。你必須使用一些線程同步技術。 – yano