![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.3ベストアンサー
- 回答日時:
>この結果、実行時間はXPと同じ程度に早くなりました。
>クリティカルセクションから抜けたスレッドがタイムスライスを譲ることで
>プログラム全体が高速になるのは、どのような理屈からなのでしょうか?
その箇所はwhile文やfor文の中にありませんでしたか?
だとするとビジーループに陥ってた可能性があります。(CPU使用率があるコアで100%になっていませんでしたか?)
while(true)
{
EnterCriticalSection( &CriticalSection );
・・・・
LeaveCriticalSection( &CriticalSection );
}
というコードであれば
EnterCriticalSectionで処理が止まらない限り
このスレッドがタイムスライスを使い切るまでCPUリソースを占有してしまいます。
(ほかのスレッドに切り替わったところで、このスレッドの順になればまたタイムスライスを使い切るまで占有します
→結果このスレッドがほとんどのCPUリソースを食うことになる。)
ビジーループはシステム全体に悪影響を与えます。たとえば、ウィンドウズのメッセージ処理さえ止めてしまいます。
(クリックしても反応がにぶくなる等の現象が起きます)
Xpで起きなかった原因については
・タイムスライスの設定値等の違い
・バックグラウンドで動いているプロセスによる影響
・OSによるタスク管理の違い、
等が考えられますが正確にはわかりません。
No.2
- 回答日時:
>まずWindows Vistaまたは7で動かすと、
Windows XPとWindows Vista/7はこれらは同じマシンスペックでしょうか?
コア数やHTの挙動が影響している可能性があります。
基本的に原因は地道に調べていくしかありません。(外部のプロファイラを使うのも手です。Intel Parallel Studio 2011等)
まずはどれぐらいCPUがロックされているか調べてみてください。
Windowsなら、CriticalSection、CreateMutex、CreateSemaphore、Interlock~によるスピンロック等がありますが
それらを使ってロックしている箇所がCPUリソースの何パーセント占有しているか
QueryPerformanceCounter、QueryPerformanceFrequency 等を使って調べてみてください。
http://support.microsoft.com/kb/172338/ja
※Windowsにおけるマルチスレッドプログラミングでパフォーマンスを上げるには
Interlock~を使っていかにロックレスにするかが重要です。
ところで「回答へのお礼」に書かれた
「while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){」
が ビジーループしているんじゃないでしょうか?
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){
TranslateMessage( &msg );
DispatchMessage( &msg );
Sleep(10);
}
とするだけで多少改善するかもしれません。
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )を9スレッドで回す部分は見直した方がよいかも。
PeekMessageやGetMessageを複数スレッドで別HWNDを参照するならともかくHWND指定無しで使うというのは
見たことがありませんし効果的だとも思えません。。
(Xpで軽かったのは論理コア数が少なくてビジーループが起きなかったのではという理由な気がしますがどうでしょう)
この回答への補足
恐縮ですが、1つ質問してよろしいでしょうか?
プログラムの中で、8つのサブスレッドが共通のクリティカルセクションを持っており、
どうも、そこで渋滞しているようなので、
クリティカルセクションの直後にSpeed(10)を入れてみました。
(クリティカルセクション内の実行時間は、シングルスレッドで走らせて2~3msくらい)
EnterCriticalSection( &CriticalSection );
・・・・
LeaveCriticalSection( &CriticalSection );
Sleep(10);
この結果、実行時間はXPと同じ程度に早くなりました。
クリティカルセクションから抜けたスレッドがタイムスライスを譲ることで、
プログラム全体が高速になるのは、どのような理屈からなのでしょうか?
回答ありがとうございました。
肝心なことを書き忘れていました。
同一のパソコンにXP、Vista、7を入れて確認しています。
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){
TranslateMessage( &msg );
DispatchMessage( &msg );
Sleep(10);
}
についてはSleep(10)でブレークポイントを設定しましたが停止しなかったので、
sleep(10)のwhileループの外に出して必ず実行されるようにしてみましたが、
現象は変わりませんでした。
>論理コア数が少なくてビジーループが起きなかった
論理コアという言葉すら知りませんでした。
勉強して、解決への糸口に致します。
No.1
- 回答日時:
10倍というのが、どのぐらいの時間についてのことなんでしょう?
例えばXPで10秒で終わる処理がVista、7では100秒かかったりするのでしょうか。
こんな記事はありますが、10倍というのは、パフォーマンスの低下が甚だしいですね。
http://www.computerworld.jp/topics/mcore/133949- …
回答ありがとうございます。
>例えばXPで10秒で終わる処理がVista、7では100秒かかったりするのでしょうか
その通りです。
XPで20秒くらいで終わるプログラムが、Vista, 7で数分かかります。
メインスレッドが8個のサブスレッドを起動して、
全サブスレッドの終了をループで待機するプログラムです。
各サブスレッドも、USBデバイスのステータスをループで監視しています。
9スレッド全て、ループの中で次のメッセージ処理をしていますが、
これを除いても結果は変わりません。
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){
TranslateMessage( &msg );
DispatchMessage( &msg );
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 教えてgooの OS の部分に Windows11 を追加してほしい 2 2022/08/11 19:09
- 教えて!goo 教えてgooの OS の部分に Windows11 を追加してほしい 2 2022/08/09 17:06
- Windows 10 explorerをedgeで開く方法 2 2022/06/05 14:59
- Windows 7 「このwindows 7 は正規品ではありません」正規品ではないということですか? 3 2022/06/25 11:41
- Windows Vista・XP Windows7、8のアップグレード版は、元のOSがプリインストール版だと扱いはそのままですか? 1 2022/06/05 15:27
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- Windows 10 VirtualBox からWindows XP を起動すると画面が真っ暗になってしまいました 4 2023/07/09 16:19
- ノートパソコン 中古パソコンの買い方 7 2023/03/07 16:53
- Wi-Fi・無線LAN aquos wishのパソコンへのテザリング設定 1 2023/02/08 12:13
- Windows 10 2年後のwin10,フリーで対応か? 7 2023/05/12 10:14
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドの監視方法について
-
スレッド・アウェア(thread-awa...
-
スレッドの安全な終了のさせ方
-
Windows上で、シグナル(SIGTERM...
-
スレッドでWM_TIMERを受け取れない
-
VC++スレッドの正しい終了のさ...
-
マルチスレッドプログラミング...
-
マルチスレッド?
-
スレッドの名前の取得について
-
別スレッドからメインダイアロ...
-
VC++ メインループでのイベン...
-
C# スレッドから親ウィンドウへ...
-
C言語で一定時間待機後、再実行
-
.netアプリへのSendMessageでフ...
-
pthread_attr_tへの値の代入に...
-
クリティカルセクションの使用...
-
Chat GPTに、課題として、二と...
-
Macターミナルで実行中のプログ...
-
TCP/IP通信時のサーバーからの受信
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
WaitForSingleObjectの使い方に...
-
マイクロソフトedge で5チャン...
-
スレッドの安全な終了のさせ方
-
スレッドの終了はどうやるんで...
-
スレッドにて同一メモリの書き...
-
スレッドの監視方法について
-
マルチスレッドについて
-
スレッドの終了の仕方
-
Linuxでスレッド優先度って変え...
-
Windows上で、シグナル(SIGTERM...
-
LinuxでDoEvents()同等機能
-
VB2005 シリアル通信のClose処理
-
待機関数(WaitForMultipleObjec...
-
マルチスレッドプログラミング...
-
_beginthreadexで生成したスレ...
-
msec単位のWait Timerが作れない!
-
別スレッドからメインダイアロ...
-
マルチスレッドのスレッド数を...
-
.NetのBackgroundWorkerクラス...
おすすめ情報