解決済みの質問
猫でもわかるプログラミングC言語編のマルチスレッドプログラミングについて
polykuroさん
猫でもわかるプログラミングC言語編のマルチスレッドプログラミングについて
こんにちは。いつもお世話になっています。
現在web版の「猫でもわかるプログラミング」でC言語の学習をしています。
マルチスレッドプログラミングの章をしているのですが、例として示されているものと、私の環境で実行した挙動が異なります。
例えば第102章では、実行結果として「スレッド0とスレッド1が交互に、nを表示しているのがわかります。」となっています。
(リンクを貼っておきます:http://homepage2.nifty.com/c_lang/intro2/no_102.htm)
しかし同じプログラムを私の環境で実行すると、スレッド0とスレッド1は交互に表示されず、スレッド0かスレッド1のどちらかだけ実行されます。
ここだけではなく、他のマルチスレッドプログラミングの章の挙動も、例と違うものになります。
これはどうしてでしょうか?
勝手な予想としては、この記事が更新されたのが7年ほど前のようなので、マルチスレッドプログラミングの処理が当時と違うのかな、と思いました。
どなたかご存知の方がいましたら、ご教授願います。
回答お待ちしています。
動作環境:
CPU:Intel core i3
OS:windows 7 home premium 32bit
コンパイラ:Visual C++
-
- 質問日時:
- 2012/2/14 16:07:54
-
- 解決日時:
- 2012/2/16 21:29:13
-
- 回答数:
- 3
-
- お礼:
- 知恵コイン
- 100枚
-
- 閲覧数:
- 108
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
quickbrwnfoxjumpsoverthelazydogさん
処理が違うというよりは、PCが速くなりすぎちゃったんじゃないかと思います。なんらかの方法でプログラムの実行時間を引き伸ばしてやればスレッドの切り替えが見えてきます。
例えば。
・各スレッドの実行関数のif(n<20)を例えばif(n<9999)とすると、nが2000ぐらい毎にスレッドの切り替わりが観察できる(私の環境で。より速いPCをお使いの方は適宜増やしてみて下さい)
・時間潰し関数
void w0(){
int i,j,k;
for(i=0;i<10000;i++){
for(j=0;j<10000;j++){
k=i+j;
}
}
}
を定義し、各スレッド実行関数で
if (esc)
break;
w0();
とでもしてやると交互動作する。
・各スレッド実行関数で
if(esc)
break;
Sleep(1);
としてやってスレッド動作を中断して制御をシステムに返すようにすると交互動作する。
- 違反報告
- 回答日時:2012/2/14 16:56:31
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
0人が役に立つと評価しています。
ベストアンサー以外の回答
(2件中1〜2件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
sleep ( 0 ) を、
http://msdn.microsoft.com/ja-jp/library/cc429358.aspx
一連の処理をした直後に使うと、
そのスレッドは、割り当てられた今回のタイム・スライスの時間を放棄して、
同等レベルのスレッドにタスク・スイッチされます。
OSのスケジューリングに依存しないプログラミングをするためには、
スレッド間で論理的にコミュニケーションさせる必要が、あります。
sleep は、その最低限の手段です。
それでも、OS下では、他にもスレッドがあるので、
sleep では、制御しきれないかもしれません。
resume/suspend など、セマフォ を使うのが、次の段階です。
- 違反報告
- 回答日時:2012/2/14 23:05:10
この記事が書かれたときに比べ、コンピューターの性能はだいぶ上昇しています。
スレッドはウィンドウズが自動で切り替えをして同時に動いているように見せかけますが、交互に切り替えるまでもなく処理が終了してしまっているんだと思われます。
ループの回数を増やしたり、適当に遅くする処理(Sleepなど)を挟み込んでみてください。
- 違反報告
- 回答日時:2012/2/14 16:52:14


質問した人からのコメント
勉強になりました。
ベストアンサーはquickbrwnfoxjumpsoverthelazydogさんにさせて頂きます。
他の回答者のみなさんもありがとうございました。