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ランキング
-
VC++スレッドの正しい終了のさ...
-
マルチスレッド?
-
C# スレッド終了の監視について
-
スレッドの監視方法について
-
WaitForSingleObjectの使い方に...
-
マルチスレッドプログラミング...
-
スレッドの終了はどうやるんで...
-
スレッドの安全な終了のさせ方
-
VC++ Workerスレッドを強制終了...
-
Linuxでスレッド優先度って変え...
-
VB2005 シリアル通信のClose処理
-
.netアプリへのSendMessageでフ...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
Windows10でDOSゲーム
-
explorer.exeが異様にメモリを食う
-
自分自身を更新するプログラム
-
TCP/IP通信時のサーバーからの受信
-
C言語で、メモリを解放しないで...
-
他のEXEが起動しているかの確認
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの終了はどうやるんで...
-
VB2005 シリアル通信のClose処理
-
マルチスレッドプログラミング...
-
.netアプリへのSendMessageでフ...
-
マルチスレッドについて
-
Linuxでスレッド優先度って変え...
-
Win32APIでのスレッド処理
-
pthread_cond_wait 取りこぼし?
-
LinuxでDoEvents()同等機能
-
C++ GUIのメッセージループ。
-
excelvbaでCreateThreadの動作
-
マルチスレッドの実行順序の制御
-
同一スレッドで、ロックをかけ...
おすすめ情報