1

非常に基本的な概念上の疑問。このばかげた質問で私を憎まないでください

メイン関数のスレッドから以下のような関数を呼び出すと

    char * function()
    {
            char message[10];
            .................
            ....do sth ......
            return message;
    }

この場合、内部バッファーは自動であり、スレッド関数が戻るとすぐに消えます。

しかし、これを行うとそれは機能します

    char * function()
    {
            char * message = (char*)malloc(10);
            .................
            ....do sth ......
            return message;
    }

以下の行と混同しています。これはどのように問題を解決しますか?

Each thread will allocate a different array and store the address of that array in a stack variable. Every thread has its own stack so automatic data objects are different for each thread.

4

1 に答える 1

1

各スレッドは異なる配列を割り当て、その配列のアドレスをスタック変数に格納します。すべてのスレッドには独自のスタックがあるため、自動データオブジェクトはスレッドごとに異なります。

このコメントは、2番目のコードスニペットとは関係ありません。このコメントの意味は、各スレッドには独自のスタックがあるためです。複数のスレッドが同時に同じ関数を呼び出す場合、ローカル変数をそれぞれのスタックにプッシュするため、競合は発生しません。

実際、2番目のコードスニペットは機能します。これは、関数が呼び出されるたびに、新しいヒープメモリが動的に割り当てられ、そのメモリへのポインタが返されるためです。

注意:通常、メモリの割り当てを解除したら、メモリの割り当てを解除すると便利です:)

また、上記の最初のコードスニペットとジェームズとコービンのコメントを再確認ください。この関数は、多少疑わしいものではありますが、無効ではありません〜たとえば、ここを参照してください

于 2012-04-27T00:17:42.987 に答える