0

ループに関する C++ Boost の質問。

そのため、私はできる限り多くの情報を調べてきましたが、私がやろうとしていることの例や、それがどのように機能するかの原則をまだ見ていません.

私は余暇を利用して、数年間 C++ でゲームを設計してきました。ゲームロジック用のコアエンジンと、大まかな入力システムをすべて把握し、出力に OpenGL と AL を使用しました。私がやりたいことは、エンジンを起動する方法を見つけ出し、入力システム、グラフィック エンジン、およびサウンド システムを別々のスレッドで実行することです。そしてすべてが同時に実行されます。スレッドを同期することが次のステップですが、スレッドを一緒に実行することができません。

boost::thread gTrd(boost::bind(&game::runGraphics, this));
gTrd.join();
boost::thread sTrd(boost::bind(&game::runSound, this));
sTrd.join();
boost::thread iTrd(boost::bind(&game::runInput, this));
iTrd.join();
boost::thread cTrd(boost::bind(&game::runCore, this));
cTrd.join();

それが私がこれまでに得たものです。問題は、gTrd のグラフィックス エンジンには、プログラムが終了するまで続くと思われる無限ループがあるため、空白の画面が表示されますが、sTrd が起動しないことです。

理論的には不定スレッドであるスレッドを実行できるようにするには、正確に何が必要ですか? また、メモリ リークに関して注意する必要がある潜在的な問題についても知っておくとよいでしょう。

4

3 に答える 3

1

何をするか知ってjoin()いますか?これを呼び出すと、join を呼び出したスレッドが終了するまでメイン スレッドがブロックされます。コードでは、1 つのスレッドを開始し、join を呼び出して終了するまで待機し、別のスレッドを開始してこのプロセスを繰り返します。実行を継続できるように呼び出すdetach()(スレッドがいつ実行を終了するかは気にしません) かjoin()、すべてのスレッドを起動した後に呼び出します (必要に応じて)。

注:スレッドの実行が終了するまで待機する場合にのみ、join を呼び出します。

于 2013-02-16T23:08:21.403 に答える
0

join()実行を停止することが予想される場合は、すべてのスレッドのみを実行する必要があります。あなたが言ったように、各スレッドはある種の無限ループで実行されているのでjoin()、スレッドに実行を停止するように要求する前に呼び出すと、メインスレッドは実行を再開しません。

代わりに、最初に、実行を終了することを期待するスレッドに通知する必要があります。これが擬似コードで、あなたが望むことをする簡単なメカニズムです:

RunGame() 
{
    initialize_all_threads(); //just like your sample code does minus the join functions
    ...//do stuff while game is running
    wait_for_quit_signal_from_input_thread(); //note that the input thread is the only thread which transfers messages back to the main thread
    //quit signal received, so we should quit game
    signal_all_threads_exit(); //via some kind of flag/synchronization object which all thread "main loops" are listening on
    join_all_threads(); //wait for threads to gracefully end, perhaps with a timeout

}
于 2013-02-17T00:08:29.383 に答える
0

とにかくすべての join() をダンプしないのはなぜですか?

boost::thread gTrd(boost::bind(&game::runGraphics, this));
boost::thread sTrd(boost::bind(&game::runSound, this));
boost::thread iTrd(boost::bind(&game::runInput, this));
game::runCore();
于 2013-02-17T07:45:33.930 に答える