ホームページ  >  記事  >  運用・保守  >  Linux のマルチスレッドおよび同じメモリへのマルチスレッド同時アクセスの問題を解決する方法

Linux のマルチスレッドおよび同じメモリへのマルチスレッド同時アクセスの問題を解決する方法

WBOY
WBOY転載
2023-05-17 17:26:232043ブラウズ

なぜマルチスレッドが必要なのでしょうか?

  • 同じアドレス空間とすべての利用可能なデータを共有する並列エンティティの機能は、複数のプロセスのアドレス空間が異なるため、マルチプロセス ロックでは表現できません;

  • スレッドはプロセスよりも軽量で高速です。

  • ##大量の IO 処理と計算が必要な場合、複数のスレッドを使用するとパフォーマンスが大幅に向上します。
  • マルチ CPU システムでは、マルチスレッドが有利です。このようなシステムでは、物理的なマルチスレッド並列処理を真に実現できます。
  • #利点マルチスレッド

プログラムの応答を高速化;
  • 処理する必要のあるタスクがない場合、プロセッサ時間を与えることができます。他のタスクへ タスク;
  • 処理に多くの時間を費やすタスクは、定期的にプロセッサ時間を他のタスクに割り当てることができます;
  • タスクいつでも停止可能;
  • 各タスクの優先順位を個別に設定してパフォーマンスを最適化できます;
  • #最適なアプリケーション シナリオ

時間のかかるタスクやプロセッサに負荷がかかるタスクは、ユーザー インターフェイスの操作をブロックします。

  • 各タスクは外部リソース (リモート接続やインターネットなど) を待つ必要があります。接続)

  • マルチスレッドの欠点

共有リソースを待機すると、プログラムの実行速度が遅くなります。これらの共有リソースは主に次のとおりです。プリンタなどの排他的リソース;

  • スレッドの管理には追加の CPU オーバーヘッドが必要;

  • スレッドのデッドロック、つまり、長い待機またはリソースの競合、

  • パブリック変数の同時読み取りまたは書き込みでは、予測できないエラーが発生することがよくあります。

  • 検証のアイデア

  • 同じグローバルへの読み取りまたは書き込み変数 (初期値は 0 ) を使用して操作する場合、各スレッド関数は 1000 回実行されるため、5 つのスレッドは 5000 回となり、グローバル変数の最終値は 5000 になるはずです。

さまざまな試みを実行したところ、wg 値が 5000 になる場合もあれば、4997 または 4998 になる場合もありました。

Linux のマルチスレッドおよび同じメモリへのマルチスレッド同時アクセスの問題を解決する方法

理由は次のとおりです:

wg で行うことはアトミックな操作ではありません。命令に変換されます。複数の命令で構成されます。バイナリ命令は、によって実行されます。コンピュータは変数を自動的に変更します。この操作は多くのステップに分かれています。たとえば、wg を読み取るスレッドが 2 つありますが、一度に完了することはできません。最初に val が読み取られ、その後、再度読み取られます。 . この操作はまだ終わっていないので、別のスレッド wg も読み込んでから、もう一度読み込んでください。 2 つのスレッドが wg=1; を追加する可能性がありますが、最終的な値は 2 になります。

問題をコード レベルで考えることはできません。コードが実行される環境も考慮する必要があります。仮想マシンの設定を観察すると、プロセッサが 4 つあることがわかりました。少なくとも 2 つのプロセッサが他のスレッドを処理している 1 つのスレッドが 2 つのプロセッサに配置され、同時にアクセスされる状況が発生する 5000 未満の発生確率は比較的高いですが、これも並列実行によって引き起こされます。

プロセッサを 1 つだけ有効にした後は、1 つのスレッドだけが実行され、他の 4 つのスレッドは確実に実行されません。2 つのスレッドが同時に実行される状況はありません。時間。

Linux のマルチスレッドおよび同じメモリへのマルチスレッド同時アクセスの問題を解決する方法5000 未満が出現する確率は非常に小さいです (その理由は、val 値 1 を読み取った後は戻る時間がないためです。この時点で、タイム スライスが到着し、スイッチが切れています。他のスレッドに切り替えるとき、読み取り値は 1 のままです。加算して加算、オンサイト回復、または加算して 1 で加算します。このシナリオが発生する可能性は非常に低いです) 1 つのプロセッサを並列化することはできません。

以上がLinux のマルチスレッドおよび同じメモリへのマルチスレッド同時アクセスの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。