- 締切済み
マルチスレッド マルチCPU環境にて
thread1() { while( 1 ) { procA(); //ある程度時間のかかる処理 countA++; } } thread2() { while( 1 ) { if ( countA>=countB ) { procB(); countB++; } nanosleep( minimum ); //*1 } } thread1のprocAの終了にあわせて、thread2でprocBを処理しています。 *1のsleepを入れない場合、thread2がthread1の待ちの間、1つのCPUを100%使ってしまいます。 procA終了後、procBの処理は、なるべくリアルタイムに近づけたいのですが、 sleepを入れず、1つのCPUを100%使ってProcAの処理を監視した場合とどちらが効率がいいのでしょうか? 2CPUと4CPUでも話は違ってくるのでしょうか。。 procAの終了後にthread2にsignalを送る方法は、今回考えていません。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- i-kujou
- ベストアンサー率50% (13/26)
そういう時のためにSignalやらMutexやらがあるので、それを使わないというのは、どちらも非効率です。 あえていえば、この場合sleepしている間は当然pocA()の終了を検知できないため、最悪sleepしている時間だけループを抜けるのは遅くなります。 ただし、sleepしない場合busyループとなるので、ループ処理にCPUをとられて、そもそもprocA()の処理にかかる時間が長くなってしまいます。 マルチCPUの場合、procA()に対する負荷は減りますが、メモリバリア(この場合、procAを処理するCPUとprocBを処理するCPUでフラグcountA,countBの値の同期をとること)処理が入るため、結局sleepしたほうが早くなってしまう可能性もあります。 実際にどうなるかはやってみなければ分かりませんが、どちらにせよ非効率なのには変わりないと思います。