ここから本文です

解決済みの質問

猫でもわかるプログラミング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++

違反報告

ベストアンサーに選ばれた回答

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);
としてやってスレッド動作を中断して制御をシステムに返すようにすると交互動作する。

質問した人からのコメント

  • スレッドが切り替わる前に処理が終わってしまっていたのですね。
    勉強になりました。
    ベストアンサーはquickbrwnfoxjumpsoverthelazydogさんにさせて頂きます。
    他の回答者のみなさんもありがとうございました。
  • コメント日時:2012/2/16 21:29:13

グレード

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 0点(5点満点中)0人が役に立つと評価しています。

ベストアンサー以外の回答

(2件中1〜2件)

並べ替え:回答日時の
新しい順
古い順

 

hideakira_2010さん

sleep ( 0 ) を、
http://msdn.microsoft.com/ja-jp/library/cc429358.aspx
一連の処理をした直後に使うと、
そのスレッドは、割り当てられた今回のタイム・スライスの時間を放棄して、
同等レベルのスレッドにタスク・スイッチされます。

OSのスケジューリングに依存しないプログラミングをするためには、
スレッド間で論理的にコミュニケーションさせる必要が、あります。
sleep は、その最低限の手段です。

それでも、OS下では、他にもスレッドがあるので、
sleep では、制御しきれないかもしれません。

resume/suspend など、セマフォ を使うのが、次の段階です。

const_unsigned_charさん

この記事が書かれたときに比べ、コンピューターの性能はだいぶ上昇しています。
スレッドはウィンドウズが自動で切り替えをして同時に動いているように見せかけますが、交互に切り替えるまでもなく処理が終了してしまっているんだと思われます。
ループの回数を増やしたり、適当に遅くする処理(Sleepなど)を挟み込んでみてください。

知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

話題のキーワード

[カテゴリ:C言語関連]

ただいまの回答者

01時38分現在

2382
人が回答!!

1時間以内に4,335件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する