掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ProgressBarの使い方で? (ID:115553)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
話題が脱線しかけていますが、一応補足を。 例えば、グローバル変数を作って、複数のスレッドから その変数にアクセスするのは、基本的に NG です。 それこそ、 myVar = myVar + 1 という単純なコードでさえ、「同時に実行」された時に問題になります。 (1) Thread1 が、変数 myVar の値を読む。 (2) (OS が)Thread1 を中断し、Thread2 を実行させる。 (3) Thread2 が、先の myVar の値を読む。 (4) Thread2 は、その値に1を加算して、myVar に格納する。 (5) Thread2 が中断され、Thread1 が再開。 (6) Thread1 も、先ほど読み取った値に 1 を加算して格納。 # 何が問題になっているかわかりますか? 上記のパターンで、myVar の値が 10 だったとします。 この時、(1) の段階で Thread1 に取得された値も、「10」です。 その後、(3) の段階で Thread2 に取得された値も、「10」です。 そして、(4) にて Thread2 は、myVar を「11」に更新します。 最後に、(6) にて Thread1 も、myVar を「11」に更新します。 Thread1 と Thread2 が、それぞれ1回ずつ(計2回)処理したのに、 増加した値は +2 ではなく、+1 になってしまうわけです。 # マルチスレッドプログラムで厄介なのは、こうした同時実行に関する # 問題が発覚し難い(再現性が低い)事にあります。 このような問題を回避するためには、 (方法0) マルチスレッド化を諦める。 (方法1) そもそもグローバル変数を使わない。 (方法2) グローバル変数を使うにしても、1変数につき1スレッドだけが アクセスする事にしておく。 (方法3) 複数のスレッドからアクセスしたいなら、何らかの「同期化」の 手法を用いて、複数のスレッドからアクセスできないようにする。 などの回避策が必要です。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.