単純な Go シミュレーション - 同時実行の問題

PHPz
リリース: 2024-02-09 14:10:10
転載
669 人が閲覧しました

単純な Go シミュレーション - 同時実行の問題

php 編集者の真一が、シンプルだけど面白い囲碁シミュレーションゲーム「同時実行問題」をお届けします。このゲームは同時プログラミングをテーマにしており、仮想世界で同時プログラミングの魅力を体験することができます。ゲームでは、プレイヤーは複数のタスクの同時実行を処理し、同時プログラミング能力をテストするコードを作成する必要があります。ゲームインターフェイスは簡潔かつ明確で、操作はシンプルで初心者が始めるのに適しており、プレイヤーが選択できる複数の難易度とチャレンジモードも提供します。初心者でも経験豊富な開発者でも、このシミュレーション ゲームでは同時プログラミングの楽しさを楽しむことができます。

質問内容

私はポーランド出身の学生で、今学期から同時プログラミングコース(Go、Ada、および将来的にはいくつかの理論言語とCSP言語)を開始しました。正直に言うと、Golang は面白そうですが、少し混乱しています。結論から言うと、私の経験では、私は自分自身を平均以下のプログラマーと呼んでいます。基本的に、私のタスクはシミュレーションを作成することです。これを次のように説明します。

  • n*m 個のグリッドがあります

  • 旅行者は最大 k 人までランダムに生成でき、各旅行者は一意の ID (1、2、3 など、最大 k) を持ちます。

  • ランダムな瞬間に、スペースに空きがある場合 (空きスペースは 0 であると確信しています)、旅行者はグリッド上を上下左右に移動できます。
  • メッシュの現在の状態や最近の動きを印刷するカメラもあります (まだ実装されていません)
  • 非公式には、それが何を意味するにせよ、チャネルを使用する必要があると聞きました。
  • 私のアイデアは、各旅行者の ID と座標を含む構造を作成し、その ID を移動意欲を表すチャネルに送信してから、移動方向をランダムに選択するというものです。
同時実行性について少し混乱しています。wgs と mutex をどこで使用する必要があるかだけでなく、たとえば func(){} を実行する場合、ループを内側に置くべきか外側に置くべきかについても混乱しています。私のコードを修正するためのヒント、ヘルプ、または修正/アイデアがあれば大変感謝いたします。ご推察のとおり、現時点ではコードが適切に機能していないためです(たとえば、カメラがグリッドを印刷するとき、時々 k 人を超える旅行者がいる場合がありますが、複数の旅行者が存在する場合があります)。旅行者は同じ番号を共有しており、場合によっては消えてしまったように見えます)。皆さんが素晴らしい一日を過ごせることを願っています。何か助けがあれば本当に感謝しています:)

リーリー

wgs、ミューテックス、アトムなど、すべてのアイデアに少し圧倒されています。 ######解決######

作業を同時に処理したい場合 (たとえば、カメラのスナップショットの撮影と旅行者の移動が同時に発生する可能性があります)、ゴルーチンは軽量のスレッドです。

チャネルは、Go ルーチン間でデータを転送するために使用されます。

ミューテックスは、競合状態を回避するために、ゴルーチンが排他的データ アクセスのために共有データにロックを追加できるようにするために使用されます。

  • そうは言っても:
  • ある goroutine でカメラのスナップショットを実行しながら、別の goroutine で旅行者を移動させるのは良さそうです。 Goroutine の生成は必須ではなく、一度行うだけで済むため、メインの Goroutine で実行できます。
  • あなたの場合、そのチャネルは何の利益ももたらしません。メッセージを生成し、それをチャネル経由で動作を実行する別の Goroutine に送信する Goroutine があります。これらすべてを 1 つの goroutine で順番に実行できるため、不必要な複雑さを回避できます。チャネルはさまざまなユースケースに役立ちますが、ここでは冗長です。

共有メモリ (グリッド) にアクセスする 2 つのゴルーチンがあるため、競合状態を避けるためにミューテックスが必要です。これらのいずれかが実行されるたびに、「ロック」し、作業を実行してから「ロック解除」する必要があります。ロックを取得した最初のゴルーチンがロックを解除するまで、別のゴルーチンはロック ステップでブロックされます。読み取り/書き込みロックを使用してさらに最適化できます (読み取りロックが必要なのはカメラのみで、モバイル コルーチンには読み取り/書き込みロックが必要です)

    さらにランダム性が必要な場合は、旅行者ごとに goroutine を作成できます。

以上が単純な Go シミュレーション - 同時実行の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!