ThreadA(void*) { while (bA) { A01(); A02(); A03(); } }
ThreadB(void*) { while (bB) { B01(); B02(); B03(); } }
単純に上記2つの関数をスレッドとして走らせた場合、
スレッド関数処理内の関数A01-03、B01-03の処理順序は
A01→A02→A03→B01→B02→B03 or B01→B02→B03→A01→A02→A03
の2パターンだと考えたいのが素人的な僕の考えですが、以下
A01→B01→B02→A02→B03→A03
B01→A01→A02→A03→B02→B03
A01→A02→B01→A03→B02→B03
...
のようになることはあるんでしょうか?
もしくはマルチスレッドなので完全並列 ↓
A01,B01→A02,B02→A03,B03 みたいなことになるのでしょうか?
※OSはWindows2000、言語はC++を想定しております。
bA,bBは論理型でプログラム起動時に真、終了時に偽になるとします。
説明下手で申し訳ないです。どうかご教授願います。
http://www.hatena.ne.jp/1098363495#
スレッドプログラミングで質問です。 ThreadA(void*) { while (bA) { A01(); A02(); A03(); } } ThreadB(void*) { while (bB) { B01(); B02(); B03(); } } 単純に上記2つの.. - 人力検索はてな
いろいろありえるでしょう。
A01(),A02(),A03(),B01(),B02(),B03()の中身の処理がぜんぜん違って、例えば、A01()がFileIOがあり、1sかかるとして、他の処理が5msだとすると、
A01()が最初に動き出したとしても終わる前にB01(),B02(),B03()が何度も実行されるでしょう。
基本的に複数のスレッド間の実行順序は実行時にどうなるかわからないことを前提に実装しなければなりません。
Yahoo! JAPAN
URLはダミーです。
回答として一番近いのは A01,B01→A02,B02→A03,B03(完全並列)となります。
ただし、あくまでも擬似的にそう見えるだけです。(ハイパースレッドという仕組みを取り入れた一部のPentium4プロセッサや、複数のCPUを積んだサーバなどは本当の意味で完全並列処理ができますが)
マルチスレッドの仕組みは簡単に言えば時間を非常に細かく分割して
・ThreadAに与えた(ごく短い)時間を使い切ったら、ThreadAの処理を一時停止してThreadBの処理へ
・ThreadBに与えた(ごく短い)時間を使い切ったら、ThreadBの処理を一時停止してThreadAの処理へ
と非常に高速にスイッチしています。
よって、A01の関数を処理している間に、ThreadAに与えられたごく短い時間を使い切ったらThreadAは一時停止され、B01の関数の処理が動きます。また、A01、A02、A03、B01、B02、B03それぞれの関数の計算量、複雑度などは違うと思いますので、例えばA02が非常に複雑な計算を必要とする場合、A02が終わるまでにB01〜B03が何回も実行されるかもしれません。それは、関数の個数の問題ではなく、各スレッド、各関数の計算量の問題となります。
また、スレッドには優先度という概念(詳しくはヘルプのSetThreadPriorityを参照)があり、優先度で差をつけることでそのスレッドに割り当ててもらえる時間を調整することも出来ます。
おぉ、これまた詳しくありがとうございます。(^-^)
ふむふむ1CPU(HyperThreading除く)では擬似完全並列って言う形なんですか。
> マルチスレッドの仕組みは簡単に言えば時間を非常に細かく分割して
> ・ThreadAに与えた(ごく短い)時間を使い切ったら、ThreadAの処理を一時停止してThreadBの処理へ
> ・ThreadBに与えた(ごく短い)時間を使い切ったら、ThreadBの処理を一時停止してThreadAの処理へ
> と非常に高速にスイッチしています。
あ、なんか以前情報処理資格の勉強してた時こんなこと載ってたよーな気がします。
資格があっても知識忘れてたら意味ないですな。(^-^;)
マルチタスクもCPUの使用を細分化してどうたらこうたら〜て書いてたよーな…
勉強になります。も少しだけ募集します〜。
http://www.ipa.go.jp/security/awareness/vendor/programming/a03_0...
3-6. synchronized とレースコンディション
図1 並列処理のシナリオ をご覧下さい。
スレッドの切り替えは、関数単位ではないです。図1は、JAVA の行単位の説明になっていますが、正確には CPU 上での処理単位だと思います。
返答ありがとうございます。
CPU上での処理単位!あはは、早とちりしてました。(^-^;)
いやいや、危うく間違って覚える所でした。
皆様、ありがとうございました。ある程度理解致しましたので
あとは実際にプログラムを組みながら覚えていきます。
おぉ、ありがとうございます。(^-^)
やぱりThreadA→ThreadBてスレッド単位じゃなくて関数単位で実行されるのですね。
出来れば参考になるページを紹介して頂けたら幸いです。