重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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を送る方法は、今回考えていません。

A 回答 (1件)

そういう時のためにSignalやらMutexやらがあるので、それを使わないというのは、どちらも非効率です。



あえていえば、この場合sleepしている間は当然pocA()の終了を検知できないため、最悪sleepしている時間だけループを抜けるのは遅くなります。
ただし、sleepしない場合busyループとなるので、ループ処理にCPUをとられて、そもそもprocA()の処理にかかる時間が長くなってしまいます。
マルチCPUの場合、procA()に対する負荷は減りますが、メモリバリア(この場合、procAを処理するCPUとprocBを処理するCPUでフラグcountA,countBの値の同期をとること)処理が入るため、結局sleepしたほうが早くなってしまう可能性もあります。

実際にどうなるかはやってみなければ分かりませんが、どちらにせよ非効率なのには変わりないと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!