2

私はこのようなことをしたい:

void *do_work_son(void *data)
{            
    mystruct *d = (mystruct*)data;
    while(true)
    {
        // d->whatever is corrupt
    }
}

void start_thread(pthread_t *mt)
{
    mystruct data = ...;
    pthread_create(&(*mt), NULL, do_work_son, (void *)&data);
}

int main()
{
    pthread mt;
    start_thread(&mt);
    // do more stuff here
    pthread_join(mt, NULL);
}

アイデアは、いくつかのスレッドを生み出し、より多くの作業を続けmainます...そして、より多くの作業を行ったら、スレッドが終了するのを待ちます。

正常にコンパイルされますが、data内部でアクセスされると構造体が破損しますdo_work_son。これは、join inを呼び出しているにもかかわらず、スレッドが終了しているためだと思いますmainpthread_{create,join}両方の呼び出しをstart_threadに移動すると、正常に機能しますが、メイン関数がwhileループによってブロックされます。私はそれをこのようにすることに夢中ですか?

4

2 に答える 2

5

これは、スレッドが終了しているためだと思いますが、

いいえ、それは関数data内の自動変数であり、返さstart_thread()れるときに無効にstart_thread()なるためです。後でそのアドレスを使用すると、未定義の動作が呼び出されます。

そのためのメモリを消費するかmalloc()、静的にするか、何でもします。の死後も存続することを確認してstart_thread()ください。

于 2013-03-14T21:15:48.500 に答える
4

答えは簡単です。ローカル変数の参照を渡し、スコープを離れます。ヒープに割り当てられたデータに置き換えると、魅力的に機能します

void start_thread(pthread_t *mt)
{
    mystruct *data = malloc(sizeof(*data));
    ...;
    pthread_create(mt, NULL, do_work_son, data);
}

編集:

事前課題について:

void start_thread(pthread_t *mt)
{
    mystruct local_data = {...};
    mystruct *data = malloc(sizeof(*data));
    *data = local_data;
    ...;
    pthread_create(mt, NULL, do_work_son, data);
}
于 2013-03-14T21:16:14.360 に答える