1

私のプログラムでは、への呼び出しはpthread_create次のようになります。

res = pthread_create(&a_thread, NULL, thread_fn, (void*)n);

私の質問は、なぜそれができないのかということです:

res = pthread_create(&a_thread, NULL, thread_fn( (void*)n) );

これにより、パラメーターの数が減り、pthread_create論理的にも見えるため、関数に関しては、宣言、定義、呼び出しの3つだけを学びました。

関数名をパラメーターとして渡し、その引数を別のパラメーターとして渡すことに追加することは、私には理解できません。

この形式の背後に何らかのロジックがある場合は、親切に説明してください。

4

3 に答える 3

8

最も明白な議論は、「引数として」呼び出すことができないということです。これは、呼び出すthread_fnに完了するまで実行する必要があるためです。つまり、現在のスレッドで新しいスレッド向けのコードを実行することになります。 pthread_create

別の見方をすると、実行のスレッドを作成することは、必然的に OS (カーネル) コードを利用するということです。OS は、新しいスレッドが効果的に使用可能になる前に、内部の簿記構造を設定する必要があります。などによって引き起こされるカーネル呼び出しpthread_createは、スレッドで実行されるコードのメモリ アドレスを知っている必要があります。これにより、すべてをセットアップし、関数のアドレスを (戻り値ではなく)渡した後に、その場所に制御を移すことができます。 ) は最初の構文で行われます。

于 2013-09-02T20:35:30.313 に答える