C++でマルチスレッドによるネットワークプログラムの効率的な実装方法は?

このQ&Aのポイント
  • C++でマルチスレッドによるネットワークプログラムを行うための効率的な実装方法を教えてください。
  • Linux、C++でサーバープログラムを作成し、複数人の映像チャットのような通信システムを構築したいです。実装方法として、外部と通信するスレッドを1つにする方法と、各部屋ごとにスレッドを作成する方法が考えられます。
  • どちらの方法が効率的かを教えてください。また、それ以外の効率的な実装方法があれば、それについても教えてください。
回答を見る
  • ベストアンサー

C++でマルチスレッドによるネットワークプログラムを行いたいと考えてお

C++でマルチスレッドによるネットワークプログラムを行いたいと考えております。 質問の内容は「どちらの方が速度的に有利か?」という二択です。 Linux、C++にてサーバープログラムを作成する予定で、実装したい内容は複数人の映像チャットのようなものをP2P型ではなくサーバー-クライアント型で行います。 1部屋で10人の通信を行うとして10部屋の通信を扱いたいです。(部屋の数は変動します) そこで以下の方法のどちらが効率的かを教えていただきたいです。 方法1 外部と通信するスレッドは1つで使用するポートも一つ(100人からの接続をポーリングで対処) 部屋の中身の処理をマルチスレッド化しておき通信システムが各部屋と情報をやりとりする 方法2 部屋ごとにスレッドを作成 各部屋(スレッド)が通信機能を持ち、ポートは部屋ごとに変える 方法1、2以外に、どちらも変わらないという選択肢でも構いません。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.1

Linuxではどちらの方法も無理 1) Socketがストリーム扱いで1プロセスが使用出来るストリームは最大64個まで。(stdin,stdout,stderrも64個のストリームに含まれる。) 2)POSIXの実装が不完全なためスレッド間でSocketを共有出来ない。 スレッドが実質チャイルドプロセスとして扱われる。 実質的にマルチスレッドじゃなくてマルチプロセスとして考える必要がある。 ListenSocet開いてからForkすれば1プロセス64ストリームの制限は回避出来るけどスレッド間でSocketが共有出来ないのはいかんともしがたいので方法1をプロセス間通信で代替えする方法で実現するしかなくかな~り面倒。 WindowsかSolarisだと方法1で楽に実装出来るんですけどね。 方法2はクライアント側の制御が面倒くさそう。

その他の回答 (1)

回答No.2

ポート番号を10個用意できるなら、方法2のほうが振り分け処理がない分早いんじゃないですかね。 質問とは関係ないですが、そのあとの処理もボトルネックとしてあるかもしれません。例えば1つの部屋にAさんとBさん入ってきて、Aさんの処理が終わるまでBさんが待たされるとか。構築したいシステムがわからないので、的はずれな意見かもしれませんが。

関連するQ&A

  • プログラムのマルチスレッド化について。

    マルチスレッド化したプログラムの作成を行いたいと思い、 前に作った、スライス画像を作成するプログラムを マルチスレッド化しようと、自分作ってみたのですが、デバック中に エラーで、止まってしまいます。 プログラムはこれです。http://koushi12.if.land.to/main.h この中の、///ここでエラーがでます/// というところで止まってしまいます。 ちょっと長いので、もしお時間ある方いらっしゃっいましたら見ていただき、修正箇所を指摘していただきたいのですが、 プログラム読むほど時間無い方には、質問で答えて頂きたいのですが、 各スレッドに、データ(引数)を渡すところで、 1つのデータ(例えばポインタで作ってある、画像データ)を、2つのスレッドに渡しても大丈夫なのでしょうか? データは、2つ作って、それぞれを、それぞれのスレッドに渡さないとダメなのでしょうか? それと、例えば、出力関数などを1つだけ作ってあったとして、 それを、各スレッドの中で、呼び出して大丈夫でしょうか? 関数も、各スレッドが呼び出しで衝突しないように、2つ作る必要があるのでしょうか? すみませんが、回答よろしくお願いします。

  • マルチスレッドチャットプログラム作成方法

    マルチスレッドでチャットプログラムが組みたいです。 winsockを用いてVC++2010EEで組んでいます。 selectでのC/S型チャットプログラムは組めます。 マルチスレッドプログラムに関しては「猫でもわかるプログラミング」C言語編第1部第99章以降を参考にしました。 このサイトでのプログラムは分かるのですが、いざ自分のチャットプログラムに実装しようとするとどうすればいいのか分からなくなります。 やりたいこと(こうすればいいのだろうと思っていること)は winsockの設定 while(1) { ----SockBuf = accept(略); --------if( SockBuf != INVALID_SOCKET) --------{ ------------MaxClient++; ------------Sock.push_back(SockBuf); --------} ----thread()をSock[0]~Sock[MaxClient-1]ごとにスレッドで動かしたい。 ----その他の処理 } unsigned __stdcall thread() { ----recv(略) ----その他の処理 } どのようにしたらいいのか分からないので教えてください。

  • マルチスレッドプログラミングの利点について

    はじめまして。 質問があります。 現在マルチスレッドプログラミングについて学習しているのですが、 学習を進めていくうちにある疑問が思いつきました。それは、 マルチスレッドで実装した方がよい場合とシングルスレッドで実装 した方がよい場合の区別がよくわからないということです。マルチスレ ッドで実装する利点は、例えば、応答性を向上させるとか、 入出力操作が関わっているときにCPUの空き時間を利用して別スレッド で処理を行わせることによってスループットを向上させることぐらいしか思いつきません。また、CPUが1個しかない環境では、 CPUをフル活動するようなプログラムでは、下手にマルチスレッドで 実装するよりもシングルスレッドで実装したほうが排他制御しない 分だけ処理スピードは上であると思っているのですが、間違いでしょうか?マルチスレッドで実装した場合の利点は上述したこと以外にも 何かあるのでしょうか?ご教授お願いします。

    • ベストアンサー
    • Java
  • マルチスレッドの実装について

    只今、数冊の本を読み、現在マルチスレッドの部分を やっているのですが、 参考本AとBには class Sample extends Thread { というやり方が書いてあり、 参考本Cには class Sample implements Runnable { というやり方だけ書いてあります。 どういう事だと思い、クラスリファレンス本を読んでみると、 『マルチスレッドプログラミングを行う際にはthreadを継承するか、Runnableインターフェイスを実装します』 とだけ記述されていました。 参考本AとBは2002年に発行・改訂されており、「extends Thread」の説明しか載っていませんでした。 参考本Cは2000年発行で改訂はされていません。 Q:この2つは使い分けのようなものがあるのでしょうか?

    • ベストアンサー
    • Java
  • マルチスレッド化。

    今とても大きな配列を使用し、長時間処理をするプログラムを組んでいます。元々処理時間に1時間を要するプログラムを2分で処理を完了するまでに仕上げました。 しかし、探究心はおさまらずもう少し高速化に挑みたいと考えています。 過去に「猫でもわかる」のSDK第1章と2章を学び、マルチスレッドのプログラムをSDKで組んだことがあります。それを利用してマルチスレッド化を実現したいと考えています。 言語はCでVisualStudio2005を使用しています。 *疑問1   SDKの場合WinMain関数とプロシージャからの実行で_beginthread関数を記述すれば処理が開始されます。 Cでもmain関数内に記述すれば、SDKと同様に処理できるのでしょうか? *疑問2 _beginthread関数の引数に関してです。 第1引数にvoid型のスレッド関数、第2引数に0?、そして第3引数にはスレッド関数に渡すデータの引数を記述すると把握しているのですが、渡したいデータは複数あり、***型と**型、それに変数を数個とスレッド関数に渡したいデータだらけなのですが、どのように記述すればよいでしょう? *疑問3 2つのスレッドを作成しようと考えていますが、その2つのスレッドで1つの大きな配列を共有して処理したいと考えています。 そのため、スレッド間の同期が必要になるわけですが同期の種類にもクリティカルセクションやミューテックス、イベントと豊富でどれを使用すれば良いのか迷ってしまいます。厳密に同期を取り処理をするにはイベントが一番良いと考えています。 これらの疑問に答えられる方はアドバイスをよろしくお願いします。

  • 古いマルチスレッドプログラムはマルチコアに対応しているのか

    Windows上での話という事でお願いいたします。 HTが出始めた頃の高級言語C++やDelphi等で作成した、マルチスレッドプログラムは、そのままでマルチコアに対応しているのでしょうか? 多くの記事やネット上の情報およびインテルのQuad coreのプロモーションを見る限り、プログラムがマルチスレッドならば、そのままマルチコアを有効に利用できるような事が書いてありますが、プログラミングにおいて、特別にマルチコアに対応するようなコードは必要ないのでしょうか? C#用のQuad Core対応といったようなライブラリもあり、特別な処理が必要なのではという雰囲気がただよっているのですが・・・。 (ライブラリのソースまで見れたわけではないので、実態がよくわからない) Quad Core対応のライブラリというのは、いったい何をしていると予想されますでしょうか。 4スレッドで動く事を前提に最適化されているだけなのでしょうか。 といった疑問なのですが、お暇がありましたら ご回答いただければ幸いです。

  • C++ シングルトン マルチスレッド

    標準C++でシングルトンを実装したいのですが。 class Singleton{ public: static Singleton* getInstance(){ if (_instance == NULL){ //スレッドAがこの時点で、スレッドBがNULLチェックすると破綻する _instance = new Singleton(); } return _instance; } private: Singleton(); static Singleton* _instance; }; マルチスレッドになると上記のパターンで破綻するといわれどうしたものかと考えております。 static Singleton* _instance = new Singleton(); と出来れば解決なのですが 「static const int データメンバ以外をクラス内で初期化することはできません」 とのことでそれもできず。 どのようにすればよいでしょうか。

  • Androidのマルチスレッド処理の開始タイミング

    組み込みボード上にAndroidOSをのせ、 その上でRS232C通信制御するプログラムを作成しております。 RS232C通信制御についてはThreadクラスを派生させたクラスを 作成し、マルチスレッド処理として、アプリ起動中に、常に動作させたい と考えています。 このとき、RS232C通信制御するスレッドを 開始するタイミング、終了するタイミングはメインアクティビティのどの タイミングで行うのが1番よいのでしょうか? 現状は以下で考えています。 public class MainActivity extends Activity { ComCtrl m_ComCtrl ; // RS232C通信制御スレッド protected void onCreate(Bundle savedInstanceState) { m_ComCtrl = new ComCtrl( null ) ; // スレッド生成 m_ComCtrl.start() ; // スレッド開始 } protected void onDestroy() { m_ComCtrl.halt() ; // スレッド終了(スレッドメインループを終了させる独自メソッド) } }

    • ベストアンサー
    • Java
  • マルチスレッドプログラムでメモリが増加

    VS6.0 で マルチスレッドのDBアクセスプログラムを作成しています。 現在、スレッドを起動し、スレッド内でデータベースオブジェクトを宣言、オープン、クローズしているだけなのにメモリが増えつづけてしまっています。 宣言方法等、何か問題がありましたら指摘ください。 (ちなみにスレッドから起動されたスレッドです。) ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ void __cdecl XXXApp::XXXThread( void* arg ) { CDatabase m_DB; m_DB.OpenEx( 接続文字列, CDatabase::useCursorLib|CDatabase::noOdbcDialog ); if( m_DB.IsOpen() == TRUE ){ m_DB.Close(); } _endthread(); } ◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎ すいませんがアドバイスをお願いします。

  • Cでネットワークプログラミングをするには?

    C++とwin32APIを勉強中の者です。 早速質問なのですが、C言語でネットワークプログラミングを行うにはどうしたらいいのでしょうか? 通信にも色々あるのでしょうが、例えばサーバーに接続したりだとか、PC同士で通信(遠距離や近距離)を行ったりだとかするソフトはどのように実装されているのでしょうか。場合によっては自分でサーバーを開設しなければならないといったこともあるんですかね? というのも将来作りたいと思っているソフトがあって、そのソフトがサーバーから情報を取得したりPC同士での通信(電話みたいなことをしたい)を行うようなプログラムなのですが、通信についてはまったくの素人で、何から勉強したらいいのか分からない状態です。 主な通信にはこんな技術が使われていて、それをプログラムで使うにはこんな知識が必要、みたいなことを教えていただけたら幸いです。 回答よろしくお願いします。

専門家に質問してみよう