以下の機能は動作しません。 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;
...
'' pthread_create'の直後に 'params'が失われます。私は関数 'pin_monitor_create'の終わりにしか行かないとほとんど確信していました... ;-(基本的なスコープの概念がありませんか? – natenho
いいえ、彼がもう一度書いたものを読んでください。' pin_monitor_create '。 –
@natenho' pthread_create'の後に失われることはありません。 'pin_monitor_create'の後に失われます。スレッドスケジューラを直接制御することはできません。あなたが運が良ければ、メインスレッドが終了する前に 'pin_thread_function'スレッドが実行されると、あなたの文字列が表示されるか、マルチコアチップ上で2つのスレッドが本当に並列に実行される可能性があります。いくつかのスレッド同期技術を採用する必要があります。 – yano