3

私は常に、ページが実行され、実行が完了し、出力が得られる PHP などのスクリプト言語を使用してきました。ただし、2 つのタスクをマルチスレッド化する必要がある C++ では、少し違うことをしたいと考えています。

まず、メイン スレッド (たとえば) が実行され、1 秒ごとに更新される CPU 温度計が実行され、2 番目のスレッドが別の処理を実行する必要があります。(windows ディレクトリの下のすべてのディレクトリを読み取るように。)

とは言うものの;

  1. スレッドを使用することが唯一のチャンスですか、それともこのタスクに別のプログラミング概念を使用できますか?

  2. 特にゲームでは、バックグラウンドで実行されているものがたくさんあります。たとえば、NPC/モンスターの AI、グラフィック エンジン、物理エンジン、プレイヤーの動き、キーボードの操作など。それらは単一のプロセスで動作しますが、どのように処理されますか?

4

5 に答える 5

3

CPU温度計を読み取るだけのスレッドを作成し、1秒ごとにディレクトリを読み取ると、キルが終了します。マルチスレッドから得られるメリットはあまりありませんが、スレッドの管理に苦労する可能性があります。TASKをリストに入れて、2 番目の方法でスケジュールすることができます。

ゲームについてはよくわかりませんが、アイテム/タスクとスケジュール/チェック/プロセスをループで分類していると思います。ソケット通信、GUI レンダリングなどの専用タスク用にいくつかのスレッドのマウントが作成されますが、クリープがオーバーキルであると言う項目ごとに専用スレッドを作成します。

私の提案は、1 つのスレッドで実行できる場合は、アプリケーションに簡単にマルチスレッドを導入しないことです。マルチスレッドは、同期の問題、スレッド管理の問題など、他の側面の影響を引き起こします。

于 2012-11-06T23:43:12.757 に答える
2

あなたの挑戦は、タスクベースの並行性を前提としていると思います。したがって、基礎となるスレッドだけでなく、非同期作業の観点から考えてください。しかし、多くのライブラリは、並行タスクのための安全で効率的で信頼性の高い高レベルの非同期APIを提供します。私は次のことをお勧めします:

  1. QtConcurrentフレームワークを使用したQt 。
  2. マルチスレッドサブパートを備えたPOCOC++ライブラリ。
  3. C++11のstd::asyncテンプレート。または、古い環境の場合はboost::thread。

標準のstd::asyncまたはboost置換には、タスクベースの同時実行性に関してさまざまな問題があることに注意してください(たとえば、新しいスレッドをフォークするとき、タスクを盗むときなど、実行ポリシーを微調整する機能の多くは提供されません)。

于 2012-11-07T07:45:36.223 に答える
0

スレッドは私見の正しい選択です。

1 つの代替手段 (OS に依存) は、子プロセスを fork することです。はい、スレッドも OS に依存しますが、少なくとも C++11 には、これらの標準的な抽象化があります。C++11 以外のアプリの場合、適切なポートが使用可能な場合、OS 用に提供されているさまざまなスレッド API または POSIX pthreads ライブラリを簡単に使用できます。

非常に単純な OS の別の代替手段は、スレッドの代わりにいわゆるコルーチンを使用することです。たとえば、FreeRTOS はこのアプローチを提供します。

あなたのポイントを詳しく説明するには2):

これには、独自の実行スレッドを実行しているオブジェクト間で情報と状態を交換するために、ある種の共有メモリを実装する必要があります。メモリを共有するには、ミューテックス、読み取り/書き込みロック、セマフォなどの適切な同期メカニズムを使用する必要があります。

特殊なケースでは、OS に依存する代わりに、独自のタスク スケジューリング メカニズムを実装することが理にかなっている場合があります。ただし、これには、タスクの実行を切り替えるための割り込み駆動メカニズムも必要です。

于 2012-11-06T23:45:35.190 に答える
0

複数のスレッドまたは複数のプロセスを使用できます。

スレッドとプロセスの主な違いの 1 つは、スレッドは1 つのメモリ空間を共有するのに対し、各プロセスには独自のメモリ空間があることです。

グラフ内のノードの挿入/削除/検索/更新など、タスクがオブジェクトを頻繁に共有する必要がある場合、マルチスレッドを使用すると、各スレッドがポインターを使用して簡単にグラフにアクセスできます。これは、複数のプロセスではより困難です。

温度の測定、画像のレンダリング、音楽の再生など、タスクがオブジェクトを頻繁に共有しない場合、1 つのメモリ空間を共有してもあまりメリットはありません。その場合、複数のプロセスが適しています。

于 2012-11-08T06:33:59.763 に答える
0

具体的なタスクとそれらの間の依存関係に依存します。

無関係なタスクがある場合は、別のプロセスで実行します。ここではスレッドは必要ありません。ただし、結合が強い場合は、マルチスレッドが正しい答えかもしれません。

于 2012-11-07T00:03:03.103 に答える