2017-04-07 7 views
0

スレッドの使用に関する専門家の助言と意見が必要です。私は2-3スレッドを持つシンプルな "プラグイン" DLLを持っており、それぞれは_beginthreadex()で始まります。C++古いPCでのスレッドCPU使用率の問題

スレッドは次のようになります。

unsigned __stdcall Thread(void* pArguments) 
{ 
    while (true) 
    { 
     // do something 
     Sleep(3000); 
    } 
    _endthreadex(0); 
    return 0; 
} 

、このスレッドは、しかし、私は古いPCのデュアルコアCPUの持つ上であることを発見した、最も新しいPCの上で期待どおりに動作しますが、高いCPU使用率を持っていません。たとえば、このスレッド方法で2-3のインスタンスを実行すると、CPUが大量に消費されます。私はなぜ自分自身を説明することはできません、そして私は何をすべきか分かりません。

CreateThread()も試しましたが、変更はありません。誰かが私にすべてのPCで同じように動作するスレッドを作成する方法を教えてくれますか?私が何か間違っていると、私に説明してください...

ありがとう!

+0

「スリープ」コールが実際に眠っていますか?それがすぐに返ってきたら、あなたのスレッドを殺して100%CPUでスピンします。 – tadman

+0

なぜあなたはCPUを使いたくないのですか?私はそれが愚かな何もしないスリープスレッドのCPU使用率を最小限にしようとしていることがわかります。 – user463035818

+0

私がテストしたのでSleep()を呼び出すのは、Sleep()に入れたXミリ秒ごとです。 –

答えて

0

_beginthreadexは、CreateThreadの単なるラッパーです。そして、CPU使用率が高い場合は、最初にスレッドを作成するために使用した方法とは関係のない「何か」のコードで問題が発生する可能性が最も高いです。プロファイラでコードを検査し、競合状態を探します。あなたが投稿したスニペットは実際には壊れています。なぜならループにはブレークがないため、メソッドに到達できないコードがあるからです。

+0

これを指摘してくれてありがとう、私の "ループ"は間違っていますか?私はあなたが私の問題を見つけたと思う。 –

+0

もしあなたが省略した "do something"コードがどこかでブレークしたら、それは壊れていません。とにかくスレッドルーチンを終了するので、_endthreadexを呼び出す必要はありません。 – dodo951

+0

まあ、私の "do something"は休憩を取っていません、それは確かです...そして、なぜ私は_endthreadexを呼び出す必要がないのですか?/ –

関連する問題