
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で質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別スレッドからのフォームのテ...
-
スレッドの監視方法について
-
C++マルチスレッド処理について
-
C# スレッド終了の監視について
-
DirectX キーが入力されるまで...
-
メインスレッドのPostMessageと...
-
マイクロソフトedge で5チャン...
-
WaitForSingleObjectの使い方に...
-
別スレッドのデータを受信できない
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
ループを使わずに、特定時間に...
-
C# シリアル通信でデータ受信...
-
パソコンの演算速度について
-
フレームワーク「4.8.1」で、[S...
-
バックグラウンドで実行される...
-
Amazonfireタブレットにわから...
-
vb.netの型変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
WaitForSingleObjectの使い方に...
-
Windows上で、シグナル(SIGTERM...
-
スレッドの監視方法について
-
CWnd::OnTimerのスレッドの取得
-
スレッドにて同一メモリの書き...
-
スレッドの安全な終了のさせ方
-
スレッドの終了の仕方
-
別スレッドからメインダイアロ...
-
スレッドの終了はどうやるんで...
-
Linuxでスレッド優先度って変え...
-
メインスレッドのPostMessageと...
-
マルチスレッドプログラミング...
-
待機関数(WaitForMultipleObjec...
-
VB2005 シリアル通信のClose処理
-
excelvbaでCreateThreadの動作
-
.NetのBackgroundWorkerクラス...
-
スレッドでWM_TIMERを受け取れない
-
メインダイアログが最背面に表...
-
LinuxでDoEvents()同等機能
おすすめ情報