今回、最大256個のソケットハンドルをもつプロセスのパフォーマンスを向上させるため、1ソケットに対して1つのスレッドを割り当ててデータの送受信を行おうと思っているのですが、256個ものスレッドが起動された場合どれくらいのメモリを必要とするのでしょうか。また最大何個までのスレッドを持たせることが出来るのか、知っている方どうぞ教えてください。
なにかの本にスレッドを多く持つとオーバーヘッドが多くなり、逆にパフォーマンスが悪くなることもあるとありました。スレッド化する以外に何か良い方法があればそれも教えてください。

A 回答 (2件)

スレッドを使わない方法としては、


I/Oの完了を待たず、完了をイベントなりなんなり知り
処理を実行するような手があります。
非同期I/OとかNO WAIT I/OとかNone delay I/Oとか呼ぶと思いますが、正確な用語は覚えてません(^^;;

通常のI/Oはたとえば、readすればそれが終わるまでプロセスが停止することが多いですが,
OSに対してリクエストだけして完了を待たずに
関数から戻るような処理が書けます。
あとは、ポーリングするなり、コールバックなり、
イベントなりでI/Oの完了を知り、次の処理を行うようにすれば、
I/O待ちでプログラムが停止することはなくなります。
WindowsではCreateFileで FILE_FLAG_OVERLAPPED のがそれです。


今回のケースでは、端末一つに対してスレッドを生成して処理する方がいいような気がしますが。

スレッドは動的に必要なだけ生成し、その上限を256とするのがいいように思います。

スレッドあたりの具体的なメモリ消費量はわかりません(^^;
まあ、スレッド生成時にスタックサイズを指定するので、最低それだけは余分に使うとは言えますが。


あとは、スレッドを使ってのプログラムの作成経験がどの程度あるかが気になります。
各種排他管理とか、ライブラリの制限とか、優先度とか
いろいろと気にすることが増えますので。
    • good
    • 0
この回答へのお礼

色々詳しく書いていただき、ありがとうございました。
おかげでなんとなくですが修正方針が見えてきた気がします。
スレッド使用経験はというと、随分前にバックグランド印刷処理をプログラムしたくらいです。
今回はスレッドの数も多くなるし、色々気をつけないといけませんね。
ありがとうございました。

お礼日時:2002/03/28 01:14

まず、メモリの必要量はOS、コンパイラ等がわからないと回答不能ですね。


わかっても、回答できるとは限りませんが。
スレッド数にしてもそうです。
また、設定等で変更できる可能性もあります。


次に、スレッドを256個と作るとパフォーマンスが上がると考えた理由はなんでしょうか。
処理内容,OS等によって変わりますが、単に256個のソケットがあるからという理由程度なら、
パフォーマンスは向上しないでしょう。


また、256ものソケットハンドルを同時に使う必要があるかです。
必要なケースもあるでしょうが、ほんとうに必要ですか?
だいたい、256も同時に使えない可能性もあると思います。


スレッドを増やせば、ごくわずかという可能性もありますが、それでもオーバーヘッドは確実に増えます。
それでも使う理由は、例えば,
スレッドを作ることで、プログラムが簡潔に書けるとか、
処理の途中でなんらかの待ちがあるので、その時に平行して進めて起きたい処理があるとか、
マルチCPUのシステムを使っていて、スレッドが別々のCPUで処理されて、パフォーマンスが上がる可能性があるとか、
何らかのメリットがあるから使うはずです。


これ以上は具体的にどんなことがやりたいか、実行する環境(マシン,OS等)か等がわからないと、書けません。

この回答への補足

terra5さん早速の回答ありがとうございます。大変参考になりました。

質問内容があいまいだったので補足すると、OSはWindowsNTでVC++で作成し、複数端末とServer間のGWとして動作します。

現時点では1プロセスで(スレッドは使わず)実現しているのですが、そうすると
回線速度の遅い端末へ大量のデータを送信している間、他の端末への送信が行えず
かなり待たされてしまうので、データ送信はスレッド化してしまおうと考えました。

256個というのは理論値で実際には30くらいの端末を接続しています。
実装上問題がなければ256のソケットが同時並行して送受信できるように作っておきたいのです。アドバイスよろしくお願いします。

補足日時:2002/03/26 10:30
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Q◆「したらば掲示板」の「掲示板タイトル、スレッドタイトル、レスの文章」のいずれもグーグルで検索されません。

 「したらば」の無料掲示板をレンタルして管理人をしております。
 (余談ですが最近livedoorに買収された掲示板だそうです)

 「したらば」のサイトには下記のような「設定」の説明書きがあります。
---- ----
検索ロボットによるクロールを許可する:
JBBSでは通常、検索エンジンにはひっかかりませんが、
これをONにしておくとひっかかるようになります。

NAVER JAPANからのクロールを許可する:
NAVER JAPANさんからのクロールを許可します。
NAVER JAPANさんの検索エンジンに使われたり、
http://e-biz.naver.co.jp/netview/ のようなものに使われたりします。
---- ----

 「検索ロボットのクロール」は「許可」にしています。
 (ちなみに「NAVER JAPANからのクロールを許可する」などという項目は設定画面にもありませんので、説明書きが古いままなのかなという気もします)
 レンタルを開始したのも、クロールを「許可」に設定したのも、昨年夏頃からです。
 しかし現在でも「グーグル」に全く検索されません。
 なぜでしょうか?

 それから「掲示板」の「ソース表示」をすると、日本語が全て文字化けしています。
 (ちなみに、私のOSはウインドウズXPです)
 私以外の「したらば掲示板」も何件か「ソース表示」してみましたが、どこも私の掲示板と同様に文字化けしています。
 下記は他の「したらば掲示板」の「ソース表示」の一例です。
---- ----
シォソネ、ホイ眥酲セイチ、ォ、鬢ッ、・゜オ睨ヤヒナャニゥ、ア、ニクォ、ィ。
ネ翳スヘラヒセ。「コ・・ヘヘ熙ハ、ノエノヘソヘ、ヒク賚ム、ホハ、マ
---- ----
 これでは検索ロボットがクロールしても、日本語として認識されない気もするのですが、そんな心配は無いのでしょうか?

 「したらば」の無料掲示板をレンタルして管理人をしております。
 (余談ですが最近livedoorに買収された掲示板だそうです)

 「したらば」のサイトには下記のような「設定」の説明書きがあります。
---- ----
検索ロボットによるクロールを許可する:
JBBSでは通常、検索エンジンにはひっかかりませんが、
これをONにしておくとひっかかるようになります。

NAVER JAPANからのクロールを許可する:
NAVER JAPANさんからのクロールを許可します。
NAVER JAPANさんの検索エンジンに...続きを読む

Aベストアンサー

Googleに関しては参考URLをご覧ください。
ページが存在すれば必ずGoogleにキャッチされるというわけではありません。
ましてや掲示板の類だと検索にひっかかるのは難しいと思いますが。

ソースの文字化けは、単にNotepad(メモ帳)で開いたためです。
EUCコードで開けるエディタを入手してください。
なんでもかまいませんが、秀丸エディタやNoEditorなどがあります。
したらば掲示板の掲示板をいくつか参照してみましたが、文字コード情報もソース内に記載されているので、クローラが内容を判読できないというわけではないと思います。

参考URL:http://www.google.co.jp/intl/ja/webmasters/index.html

Q既存プロセスからプロセスのプライマリースレッドIDの取得方法

いつもお世話になってます。

プロセスに関することで分からないことがあるため、どなたか御教授して下さい。

只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか?

具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。

対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。

CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

いつもお世話になってます。

プロセスに関することで分からないことがあるため、どなたか御教授して下さい。

只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか?

具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッ...続きを読む

Aベストアンサー

★アドバイス
・スレッド情報を列挙して一致するプロセスIDのスレッドIDを使えば良いと思います。
 列挙しないでプロセスID→スレッドIDの変換方法は私は知りません。あれば便利ですね。
 スレッドの列挙は Thread32First()、Thread32Next() 関数で行えます。
 詳しくは次のリンクをどうぞ。
 http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0
 列挙したら THREADENTRY32 構造体の th32OwnerProcessID メンバが検索したい
 プロセスIDと一致していれば同じ構造体の th32ThreadID メンバがスレッドIDです。
 これでプロセスIDからスレッドIDに変換できます。
・以前に直接プロセスID(プロセスハンドル)からスレッドIDに変換する方法を探した事が
 ありますが見つかりませんでした。見つかったのはいずれも上記の方法ばかりです。
・以上。参考に。

参考URL:http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0

★アドバイス
・スレッド情報を列挙して一致するプロセスIDのスレッドIDを使えば良いと思います。
 列挙しないでプロセスID→スレッドIDの変換方法は私は知りません。あれば便利ですね。
 スレッドの列挙は Thread32First()、Thread32Next() 関数で行えます。
 詳しくは次のリンクをどうぞ。
 http://blog.goo.ne.jp/masaki_goo_2006/e/c80dd95f96cbd7aef524625da54b0ed0
 列挙したら THREADENTRY32 構造体の th32OwnerProcessID メンバが検索したい
 プロセスIDと一致していれば同じ構造体の th32Thre...続きを読む

Qgmailのスレッド表示について

gmailのスレッド表示、非常に便利で活用しております。
ですが、1点。。。

普通お客様からきたメールにはタイトル[Re:]では
返信しないですよね。
自分の場合、そのようなケースではお客様のメール本文は残しておいて、
タイトルだけは新しくする、という方法を取っております。
が、そうするとスレッドが分かれてしまうようです。
タイトルを替えて返信したいという方も
いらっしゃるのではないのでしょうか。

gmailのスレッドは恐らくタイトルだけでスレッドを判断しているんですよね?
どうにかタイトルを替えて返信したメールも同じスレッドにまとめることは
出来ないのでしょうか?

よろしくお願いします。

Aベストアンサー

Gmail自体が無理だ、と言ってますからねぇ。
ひとつだけ解決方法があるとすれば、Gmailをサーバとして用い、ローカルのメーラにメールをダウンロードする事くらいでしょうか。
この方法なら、表示方式はメーラのシステムに準拠しますから。
ダウンロードしてもGmailのメールはサーバにアーカイブされますから、メーラはメールの表示クライアントとして割り切り、用事が済んだら削除する、辺りでいかがでしょうか。
あるいは、スレッド表示が無理なら、フィルタ機能で自動ラベリングするという手も考えられるかと。

QスレッドAで信号を送り、返答があったときにスレッドBを起動、スレッドAの信号のデータを初期化する方法

VC6.0で開発しています。
今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。

データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。

データのやりとりは、マルチスレッドで行っています。
データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが命令Aから送られる特定のデータ(以下、データA)を受け取れるかをどうかの信号を、命令Aに送るためのものです。2つ目のスレッド(以下、スレッドB)は、データAを通信Cが受け取り、送信Bに渡すときに起動するスレッドです。

スレッドAで、送信Bから命令Aへ、受信の準備ができたことを伝える信号が送られます。その後、命令AよりデータAが送られ、通信CでスレッドBが起動するのですが、データAを通信Cで受信したとき、スレッドAで送っている信号を初期化しなければいけません。

データAを受信したときにはスレッドBが起動しますので、スレッドAとスレッドBの間での処理ということになります。

スレッド処理について、まだまだ不勉強なのですが、よいアイディアがあれば教えてください。
よろしくお願いします。

VC6.0で開発しています。
今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。

データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。

データのやりとりは、マルチスレッドで行っています。
データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが...続きを読む

Aベストアンサー

アプリ毎に整理してみました。分からないところは想像で書いています。

--命令A--
(1)「命令A→通信C」のファイルを作成。「送信Bが送信Aに対して、データの要求をしているのかを判別するデータを送信しろ」を送る。
(2)「通信C→送信B、命令A」のファイルを監視。「命令Aにデータ要求」が書き込まれるの待つ。
(3)「命令A→通信C」のファイル2を作成。「送信Bの要求データ」を作成する。
(4)「通信C→送信B、命令A」のファイルを監視。「送信Bはデータの要求をしていない」に書き換わるの待つ。
(5)(1)に戻る。

--送信B--
(1)「通信C→送信B、命令A」のファイルを監視。「送信Bが命令Aに対して、データの要求があるか」が書き込まれるのを待つ。
(2)「送信B→通信C」のファイルを作成して、「送信Bが命令Aに対して、データの要求がある」を書き込む。
(3)「通信C→送信B」のファイルが作成されるのを待つ。
(4)ファイルを読んで、データを何らかの手段で送信。
(5)(1)に戻る。

--通信C--
(1)「命令A→通信C」のファイルが作成されるを待つ。
(2)スレッド1を起動する。
(3)「送信B→通信C」のファイルが作成されるのを待つ。
(4)スレッド1に(3)に進むよう指令を出す。
(5)「送信B→通信C」のファイルを削除する。
(6)「命令A→通信C」のファイル2が作成されたことを検出。
(7)スレッド2を起動する。
(8)このあと???

・スレッド1
(1)「通信C→送信B、命令A」のファイルを作成。「送信Bが命令Aに対して、データの要求があるか」を書き込む。
(2)何らかの指令があるまで(1)を繰り返す。
(3)「通信C→送信B、命令A」のファイルを書き換え。「命令Aにデータ要求」に書き換える。
(4)何らかの指令があるまで(3)を繰り返す。
(5)「通信C→送信B、命令A」のファイルを書き換え。「送信Bはデータの要求をしていない」に書き換える。
(6)「命令A→通信C」のファイルを削除する。
(7)スレッドを終了する。

・スレッド2
(1)スレッド1に対して、指令を送り(5)に移行するように促す。
(2)「命令A→通信C」のファイル2を読み込み、「通信C→送信B」のファイルを作成する。コピー後「命令A→通信C」のファイル2は削除する。
(3)スレッドを終了する。

勘違いがあったら訂正をお願いします。

全体として問題を感じたので何点か上げます。
・ファイル作成を条件に動いている所があるが、ファイル内容が全部書き出されていないうちに動き出してしまわないか?
・必要な動作に対してやっていることが複雑である。処理の起点はなぜ送信Bの要求から始まらないのか?命令Aから始まる理由は?
・ファイルの後始末が不明確。
・スレッド1の処理で、何度もファイルを書き換える理由は?
・命令Aと送信Bが通信していれば作れそうな気がする処理で、通信Cが必要な理由が分からない。


シンプルにするとしたら、こんな感じには出来ないのでしょうか?
一応命令Aを起点にしています。スレッドがなくなってしまうので、このアプリの構成がスレッドの勉強のためだったら申し訳ない!

--命令A--
(1)送信Bにメッセージで要求がないか問い合わせる。
(2)送信Bの返事を待つ。
(3)送信要求なら、ファイルを作成する。送信不要なら(1)に戻る。
(4)送信Bにメッセージでファイルが出来たことを知らせる。
(5)送信Bの返事を待つ。
(6)(1)に戻る。

--送信B--
(1)命令Aから要求の問い合わせを待つ。
(2)命令Aにメッセージで要求の有無を送信。
(3)要求無しなら(1)に戻る。
(4)命令Aからファイルの完成メッセージが届くのを待つ。
(5)ファイルを読んで何らかの方法で送信する。
(6)ファイルを削除する。
(7)命令Aにメッセージで送信が完了したことを知らせる。
(8)(1)に戻る。

相互の通信にはWindowsAPIのPostMessageを使用する予定です。
ただし、両方のアプリにhWndが必要なので両方ともウィンドアプリである必要があります。
http://yokohama.cool.ne.jp/chokuto/urawaza/api/PostMessage.html

アプリ毎に整理してみました。分からないところは想像で書いています。

--命令A--
(1)「命令A→通信C」のファイルを作成。「送信Bが送信Aに対して、データの要求をしているのかを判別するデータを送信しろ」を送る。
(2)「通信C→送信B、命令A」のファイルを監視。「命令Aにデータ要求」が書き込まれるの待つ。
(3)「命令A→通信C」のファイル2を作成。「送信Bの要求データ」を作成する。
(4)「通信C→送信B、命令A」のファイルを監視。「送信Bはデータの要求をしていない」に書き換わるの待...続きを読む

QGmailでスレッドを無視して受信順に閲覧する方法

現在Yahooメールを使っていますが運用上の不都合が出てきたので他所に変えようと思い、いくつか試した中でGoogleの「Gmail」が気に入りました。
目障りな広告も無いし、すっきりしたインターフェイスは好感が持て、送受信の使用感も良いです。振り分けの概念の違いも慣れれば問題なさそうです。

ただ、あの特有の「スレッド表示」がネックなのです。

スレッドにすると逆に話のつながりがよく分からなくなってしまうことがあります。
例えば仲間内でメーリングリストのようなやり取りをする場合、返信だったり新規だったりするのに話は順番に続いてるということがよくあります。
今いくつか登録しているMLは、何処もタイトルはあって無いようなもので順番に読んでいく事を前提に皆が投稿します。するとGmailでは、話は一本のラインにもかかわらずあちこちのスレッドに分散されてしまい、順番に読むのが非常に困難になります。
またMLに限らず、つながりを無視して受信順を重視することがよくあります。しかしGmailはスレッド表示しかできない仕様のようで、受信順に並べて表示という選択肢がありません。

そこで質問です。Gmailでタイトルに関係なく受信順に読みたい場合、どのような方法が考えられますか?
(ローカルにはデータは取り込まない、また他のWEBメールも使用せず「あくまでGmailで」という前提でお願いします。)


※OSはvistaです。回答は急いでないので困り度は黄色にしてますが、実際は「かなり困ってます」です。

現在Yahooメールを使っていますが運用上の不都合が出てきたので他所に変えようと思い、いくつか試した中でGoogleの「Gmail」が気に入りました。
目障りな広告も無いし、すっきりしたインターフェイスは好感が持て、送受信の使用感も良いです。振り分けの概念の違いも慣れれば問題なさそうです。

ただ、あの特有の「スレッド表示」がネックなのです。

スレッドにすると逆に話のつながりがよく分からなくなってしまうことがあります。
例えば仲間内でメーリングリストのようなやり取りをする場合、返信だっ...続きを読む

Aベストアンサー

ヘルプにありますよ
http://mail.google.com/support/bin/answer.py?answer=47787&query=%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89&topic=&type=f

Qハードウェアスレッドの割り当て方法

ハードウェアスレッドがある環境で、win32APIを用いて、スレッドを特定のプロセッサに割り当てる方法を探してます。
イメージとしては.Netで言うところのThread.SetProcessorAffinityのようなものです。
ご存知の方、ご教授お願いします。
環境はXP,VC8です。

Aベストアンサー

SetThreadAffinityMaskというAPIがあります。

参考URL:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_setthreadaffinitymask.asp

Q2チャンネルは「1つスレッド」で複数のURLを持っていることあるんですか?

このカテゴリーでよろしいんでしょうか。

2チャンネルの[あるタイトルのスレッド]というのは同じ

内容で(書き込み+レスな

ど全く同じで)複数のURLを持っていることってあるん

ですか?

教えてください。

要領の悪いご質問ですみません。

Aベストアンサー

もし、発言数が 50 以下であれば、「全部」と「最新50」が同じ内容で違うURLに。
もし 100以下であれば、加えて「1-」が、そうなるでしょうね。

# 違う URL っていっても、末尾がちょっと違うだけですが

Qマルチスレッドとマルチプロセスの違い

マルチスレッドとマルチプロセスの違い
は例えて言うなら1つのプロセスをデュアルコアで処理するのがマルチスレッドで
2つのプロセスをシングルコアで処理するのがマルチプロセスってことでいいですか?

Aベストアンサー

結論から言えば、間違っています。
ただ、そのとらえ方は、あながち的外れでもないというところでしょうか。

まず、正解からいえば、文字通り、
マルチスレッド=複数のスレッドを並行して実行すること
マルチプロセス=複数のプロセスを並行して実行すること
です。
ちなみに、コア数は関係ありません。シングルコアでも、マルチスレッドでもマルチプロセスでも可能。

ということで、では、プロセスとかスレッドとかは何? ということになりますので、これは、詳しく勉強してみるといいと思います。

イメージとしては、もしも、Windows を使っているのであれば、タスクマネージャの、「プロセス」タブをみてください。

ここで、一覧表示されている一つ一つが「プロセス」です。
そして、「スレッド」という項目があると思います。
(標準では表示されていないかもしれません。この場合、表示メニューから、「列の選択」を選ぶと、その中に、「スレッドの数」というのが存在します。)
ひとつのプロセスに、ひとつ以上の「スレッド」があるのがわかると思います。
スレッドというのは、こういう単位です。

今の Windows は、プロセスとして表示されている物を並行して実行しています。そして、個々のプロセスは、ひとつ以上のスレッドを持ちます。
スレッドというのは、直訳すれば、「糸」で、「処理の道筋」を意味します。メールソフトや、掲示板で、議論の流れを「スレッド」と表現する場合もありますが、これも、意味としては同じような物です。

ひとつのプロセスの中にも、いろいろな処理があります。
たとえば、ブラウザで、こういう文章の入力を処理していたり、それと並行して、サーバーにつないで、ページが更新されてないか確認して、さらに、別のところでは、画像をダウンロードしているかもしれません。
それらのひとつひとつがスレッドだと思って、大きな間違いはありません。
マルチスレッドが可能であれば、ひとつのブラウザで、コメントを読みながら、ページを表示しながら、ダウンロードしながら、どこかのサイトからストリーミングされている音楽を鳴らすことができるのです。

一方、こうして、ブラウザでコメントを読んでいる間に、別のソフト(たとえばメールソフト)が、メールを受信しているかもしれません。
これが、別個のソフトで実行されていれば、それぞれは、別のプロセスとして動いている(可能性が高い)わけです。

その意味で、
・ひとつのプロセスの中の処理を並行しているのがマルチスレッド
・別々のプロセスを並行して処理するのがマルチプロセス
というのは、イメージとしては間違ってないでしょう。

結論から言えば、間違っています。
ただ、そのとらえ方は、あながち的外れでもないというところでしょうか。

まず、正解からいえば、文字通り、
マルチスレッド=複数のスレッドを並行して実行すること
マルチプロセス=複数のプロセスを並行して実行すること
です。
ちなみに、コア数は関係ありません。シングルコアでも、マルチスレッドでもマルチプロセスでも可能。

ということで、では、プロセスとかスレッドとかは何? ということになりますので、これは、詳しく勉強してみるといいと思います。
...続きを読む

Q【MFC】ユーザインタフェーススレッドのInitInstanceの呼ばれるタイミングについて

現在、MFCのスレッドについて学習をしている者です。

タイトルの件なのですが、CWinThread の派生クラス内の
InitInstanceが呼ばれるタイミングはいつなのでしょうか?
AfxBeginThreadで生成した時すぐでしょうか?

ご教示宜しく御願いいたします。

Aベストアンサー

AfxBeginThreadで生成した時すぐであっていますが、引数でCREATE_SUSPENDEDを指定をしていない時限定になります。
引数でCREATE_SUSPENDEDを指定した場合は、その後ResumeThreadを呼び出した時になります。

また、AfxBeginThreadの代わりにCreateThreadを使った場合も同様の動作になります。

QWindows Vista、7でのマルチスレッドのパフォーマンスの低下

Windows Vista、7でのマルチスレッドのパフォーマンスの低下について

WIN32で多数のスレッドが動作するプログラムを、Windows Vistaまたは7で動かすと、
Windows XPで動かす場合に比べて、10倍以上時間がかかります。
この原因として、何か考えられることはありますか?

Aベストアンサー

>この結果、実行時間はXPと同じ程度に早くなりました。
>クリティカルセクションから抜けたスレッドがタイムスライスを譲ることで
>プログラム全体が高速になるのは、どのような理屈からなのでしょうか?
その箇所はwhile文やfor文の中にありませんでしたか?
だとするとビジーループに陥ってた可能性があります。(CPU使用率があるコアで100%になっていませんでしたか?)

while(true)
{
EnterCriticalSection( &CriticalSection );
・・・・
LeaveCriticalSection( &CriticalSection );
}

というコードであれば
EnterCriticalSectionで処理が止まらない限り
このスレッドがタイムスライスを使い切るまでCPUリソースを占有してしまいます。
(ほかのスレッドに切り替わったところで、このスレッドの順になればまたタイムスライスを使い切るまで占有します
→結果このスレッドがほとんどのCPUリソースを食うことになる。)
ビジーループはシステム全体に悪影響を与えます。たとえば、ウィンドウズのメッセージ処理さえ止めてしまいます。
(クリックしても反応がにぶくなる等の現象が起きます)

Xpで起きなかった原因については
・タイムスライスの設定値等の違い
・バックグラウンドで動いているプロセスによる影響
・OSによるタスク管理の違い、
等が考えられますが正確にはわかりません。

>この結果、実行時間はXPと同じ程度に早くなりました。
>クリティカルセクションから抜けたスレッドがタイムスライスを譲ることで
>プログラム全体が高速になるのは、どのような理屈からなのでしょうか?
その箇所はwhile文やfor文の中にありませんでしたか?
だとするとビジーループに陥ってた可能性があります。(CPU使用率があるコアで100%になっていませんでしたか?)

while(true)
{
EnterCriticalSection( &CriticalSection );
・・・・
LeaveCriticalSection( &CriticalSection );
}

というコードであれば
...続きを読む


人気Q&Aランキング

おすすめ情報