セマフォ、レース、クリティカルセクション、およびスクラッチ。 ゾンビと植物

ほとんどすべての人が、スクラッチをエンターテイメントと見なし、すぐに結果を出します。 実際、これは最初のカップルで重要です。 ただし、今日はこの行をステップオーバーして、プログラミングのもう一方の側面を見てみましょう。







私は、多くのスプライトから同時に1つのスクリプトを実行する1つのリソースへのアクセスの構成を説明するために子供たちに与えた非常に興味深い事例をあなたと共有したい。 これにより、マルチスレッドの深刻なトピックに近づくことができます。









マルチスレッドとは、簡単に言えば、複数のコード/スクリプトが同時に実行されることです。 現在、単一のスレッドで、または順次実行されるプログラムを見つけることはすでに困難です。 そして、そのような環境で働く基本を知ることは非常に重要です。 結局のところ、プログラムのいくつかの同時部分が単一のコピーに存在するリソースを変更しようとしたり、しばらくの間個別に制御を獲得しようとしたりすると、問題が発生します。







また、重複を最小限に抑えるような方法でスクリプトを作成します。 つまり スプライトのクローンを使用しますが、個別のスプライトは使用しません。 このプログラミングスタイルを習得することは、将来の洪水(1つの変更が4につながる)を回避し、エラーの検索を簡素化するために非常に重要です。







このゲームでは、すべてがシンプルです。植物が置かれている4つのラインがあります。この場合は、ピーシュータープラントで、定期的に来るゾンビにシェルを放つことができます。







ゲームブランクへのリンク







コード例をコピーして、結果を取得します。







重要 :スプライト「Gorokhostrel」のみを変更できます







子どもたちとの植物の仕事の論理を詳しく見てみましょう。 また、たとえば、植物のスプライトは、位置が異なっていても同じように機能することがわかります。 したがって、共通のコードを作成してオブジェクトを複製することができ、別のスプライトを作成することはできません。 スプライトの場所は今ではあまり面白くありません。すべてが単純ですが、このコードを書いて説明したい場合は、コメントに書いてください。







4〜8個の植物を作成するのは難しくありません。 クローンを作成し、再度クローンを作成します。 そして今、私たちはこれらの植物が撃たなければならない瞬間に来ます。 考えてみてください。4〜8個の植物が1つの弾丸スプライトに同時にアクセスしたいと考えています。







4人のプレーヤーがサッカーボールの周りに立って同時に打つと、​​何の役にも立ちませんが、何が怪我をすると想像してください。 したがって、リソースへのアクセスを整理する必要があります。 時間単位ごとに1人の所有者。







言葉で言えば、 箇条書き重要なリソース/セクションです。 そして、このリソースを所有する権利のための闘争は人種と呼ばれます。 言い換えると、プラントの4つのオブジェクト/クローンが、クリティカルセクション/リソースを所有する権利の競争を開始します。







一言で言えばショットアルゴリズムとは何ですか?







  1. 植物クローンのクローン座標を渡す
  2. ゾンビに向かって飛ぶ座標で弾丸クローンを作成します。


このアルゴリズム/スクリプトにアクセスしないと、結果が生じます。 結局のところ、このスクリプトは重要なセクションです。 すべての弾丸は、遅滞なく、最後に公開されたクローンから飛び出します。













弾丸植物のクローンの場所を転送するには、座標(x、y)を送信する場所が必要です。 指定された2つの値を一緒に送信する必要があるため、「ウォルナットクローン座標」リストを使用します。







では、少なくとも前のビデオの動作を回避するような方法で、この変数へのアクセスを分離してみましょう。 最も簡単な方法は、リソースを時間単位で一瞬に分割することです。 より寛容な結果が得られます。 ただし、このオプションでも、リソースの同時所有権と弾丸オブジェクトの偶発的な傍受は除外されません。

























セクションへのアクセスを整理するには、1つのオブジェクトのみが弾丸にアクセスしてそのコピーを作成できるように、入り口に立っている警備員が必要です。 彼の名前はセマフォです。 セマフォは、リソースへのアクセスの順序付けのプリミティブであり、1つのオブジェクトのみによるリソースの使用を保証し、複数の値(この場合は0、1、2、3、4)を取ることができます。







セマフォを介してクリティカルセクションへのアクセスを書き込もう。







  1. オブジェクトのいくつかのクローンによるリソースの同時ブロックを即座に最小化するために、ランダムな秒の小数部を待っています。
  2. ガード/セマフォからのアクセスをリクエストします。 したがって、セマフォの値を1増やします。
  3. 誰もセマフォを使用していないことを確認してください。 値は正確に1でなければなりません。その場合、クリティカルセクションを実行します。
  4. そして、いずれにしても、セマフォを解放します。 値を1減らします。


このリソースに対して、2つのクローン(クローン1とクローン2)が競合し、それらのスクリプトが同時に並行して実行されるとします。 プログラムの実行には、いくつかの可能なシナリオがあります。 はい、実際には、プロセッサはプログラムまたはそのスレッドの実行をランダムに中断します。

















誰もクリティカルセクションを実行しないシナリオ







クローン1は最初にセマフォをキャプチャしました。 値が1増加しました。そして、突然、プロセッサは実行を中断し、クローン2が動作する時間を与え、セマフォもキャプチャしました。 セマフォの値は2に 等しくなりました。 プロセッサはクローン1に制御を移しました;次の命令は、それがリソースをキャプチャした唯一のものであることを確認することです。 セマフォ値は1である必要があります。ただし、そうではないことが検出され、クリティカルセクションはスキップされます。 クローン2が再び起動し、チェックも行います。 セマフォが2であることがわかり、クリティカルセクションの実行をスキップします。 命令に移動してセマフォの値を1減らし、セマフォを解放します。 また、クローン1はセマフォも解放します。







クローン1が重要なseckiを実行するシナリオ







クローン1が再びプロセッサ時間を取得しました。 セマフォをキャプチャし、次の比較操作に進みます。 セマフォの値をチェックすると、アクセスしたのは1つだけであることがわかり、クリティカルセクションに移動すると、突然プロセッサが実行を中断し、クローン2がゲームに入ります。 彼はセマフォをキャプチャし、次の比較命令に移動し、彼がこのリソースをキャプチャする最初の人ではないことがわかります。 クリティカルセクションをバイパスします。 プロセッサは再びクローン1を作成する時間を与え、クリティカルセクションの実行を開始します。 それを実行し、セマフォを解放します。 クローン2もリリースされ、レースが再び始まります。







これで、マルチスレッド環境での小さな作業に触れました。 多くのオブジェクトが1つのリソースで動作するように努力し、それらのスクリプトが同時に動作する場合。 10個のショットがあり、少なくともほぼ同じ時間間隔でショットが通過したことを確認するだけです。これを行うには、「このスプライトのみ」の可視性ゾーンに変数「shot happened」を追加します。





















マルチスレッドプログラミングで子供と大人に幸運を。







免責事項 :非常に正確ではない定義とその簡略化された形式を使用して、資料を理解しやすくしています。 また、精神を傷つけないように、意図的にアトミックコンテキストのトピックを取り上げず、いくつかのクローン/スレッドからのセマフォ変数の正しい変更がプログラミング言語によって保証されていると考えました。







PS: この記事は役に立つでしょう-可視性ゾーン「このスプライトのみ」での変数の働きについて説明します。








All Articles