16

スレッドとコールバックについて一般的な質問があります。たとえば、メインプログラムと一緒に継続的に実行されているスレッドがあるとします。

メインプログラムは、スレッドにコールバック関数を登録しました。したがって、スレッドはいつでもコールバック関数を呼び出すことができます。通常、スレッドに関数ポインタを渡すことでコールバックを登録します。そのコールバック関数がスレッドによって呼び出されるのはいつか、それはそのスレッドの一部になるのか、それともメインプログラムの一部になるのかを知りたいのです。コールバックがスレッドによって呼び出されたときにメインプログラムの実行がどのように停止または中断されるかなど、このプロセスのメカニズムを知りたいです。もう1つは、コールバックが呼び出されたときに関数呼び出しスタックがどのように動作するかです。

4

1 に答える 1

14

原則として、関数呼び出しは常に呼び出し元のコンテキスト(スレッド)で行われます。呼び出し先が関数、メンバー関数、ファンクターオブジェクト、またはその他のものであるかどうかは関係ありません。

つまり、スレッドがコールバックを呼び出すと、その呼び出しはスレッド内で発生します。コールバックを実行するためにメインスレッドが停止することはありません。実際、コールバックの実行には一切関与していません。

さまざまなフレームワークは、あるスレッドが別のスレッドを直接呼び出すことができるように見せるためのトリックを提供しますが、これは常に、ある種のマーシャリングされたメッセージパッシングメカニズムを介して協調的に行われます。スレッドは通常、互いのスタックをいじりません。

于 2012-08-11T11:12:49.977 に答える