3

ポータブルで効率的なサーバーをC++で構築したいと思います。同時に多くのクライアントが接続しようとするため、各リクエストを並行して処理できる必要があります。

マルチスレッド用のドキュメント、ガイドなどを見つけようとしています。POSIX Pthreadについてはたくさん見つけましたが、GNU Pthについてはほとんど何も見つかりませんでした(gnu.orgの公式マニュアルを除く)。

では、POSIXPthreadとGNUPthの違いを誰かに説明してもらえますか?ウィキペディアのコンテンツのコピーではないように応答してください(私はマルチスレッドの完全な初心者であることを忘れないでください)。サーバーをすべての*nixベースのシステム間で移植可能かつ効率的にし、重いfork()を使用しないようにしたい。

ご協力いただきありがとうございます。

PS:ここで質問したほうがいいと思います:Windowsはどうですか?PthreadsまたはPthはオプションですか?そうでない場合、そのオペレーティングシステムのAPIは何ですか?

4

3 に答える 3

5

Pthreadsを使用してください。これははるかに広く使用されているため、はるかに多くの情報とサポートを利用できます。GNUPthを実際に使用している人に会ったことはありません。または、C ++ 11を使用std::threadしている場合は使用し、使用していない場合はを使用しますboost::thread

では、POSIXPthreadとGNUPthの違いを誰かに説明してもらえますか?

Pthreadsは、プリエンプティブマルチスレッドのクロスプラットフォーム標準です。つまり、(通常)OSカーネルがスレッドを管理し、OSスケジューラが各スレッドをいつ実行するかを決定します(単一のコアがある場合、一度に実行できるスレッドは1つだけです。複数のコアがある場合は、一度に複数のスレッドを実行できます)。OSスケジューラは、(ほぼ)いつでも任意のスレッドを一時停止し、別のスレッドを実行させることができるため、各スレッドは制限された「タイムスライス」を取得し、その後、他のスレッドが実行されます。

GNU Pthは、プリエンプティブではないユーザースペーススレッドライブラリです。つまり、スレッドと、その時点で実行されるスレッドは、カーネルではなくユーザースペースで決定されます。プリエンプティブでないスレッドライブラリを使用するプログラムは、別のスレッドを実行するためにスレッドが任意の時間に一時停止されないため、理解しやすいと言う人もいます。

サーバーをすべての*nixベースのシステム間で移植可能かつ効率的にし、重いfork()を使用しないようにしたい。

forkUNIXでは重くありません。

W * ndowsはどうですか?PthreadsまたはPthはオプションですか?そうでない場合、そのオペレーティングシステムのAPIは何ですか?

Windows用のpthreadAPIがありますが、それらはWindowsOSにネイティブではありません。GNU PthがWindowsで動作するかどうかはわかりません。Cygwinを使用しない限り、疑わしいです。Windowsには独自のWin32スレッドモデルがあります。

std::threadまたはを使用するかboost::thread、POSIXプラットフォームおよびWindowsに移植可能であり、APIの特定の部分を使いやすくします(具体的には、ミューテックスのロックとロック解除は例外安全な方法で簡単に実行でき、条件変数は使いやすくなります)。

于 2012-12-20T17:40:05.947 に答える
3

Gnu PTHは、非常に限られたユースケース向けです。マルチスレッドの実装パラダイムを使用したいが、複数のCPUまたはコアを使用したくないし、OSまたはカーネルレベルのサポートに依存したくない。現在、ほとんどすべての汎用CPUに複数のコアがあるため、このユースケースはますます無関係になっています。

Windowsには、POSIXとは別のスレッドモデルがあります。アプリケーションをクロスプラットフォームにしたい場合は、boost::threadなどのクロスプラットフォームのスレッドライブラリを使用するのが最適です。

于 2012-12-20T17:44:30.217 に答える
1

GNUs PTHは、そもそもCを意味していると思います。C ++でも使用できますが、C++にはとにかく独自のものがあります。

低レベルの書き込みツールのようにpthを使用するアプリケーションはかなりあります(したがって、K3BやBraseroのようなGUIツールはpthに依存します)。また、GnuPGはPTH、Archlinuxのパッケージ管理、およびいくつかのマルチメディア関連のものを使用します。

Windowsでは、常に少し複雑です。Microsoftは、CがUNIXシステムから/のプログラミング言語であるという事実を決して乗り越えなかったので、NIH症状に苦しんでいます(ここでは発明されていません)

ですから、彼らはただ違うだけで何の利点もなく多くのことをします。

どこでも実行する必要があり、低レベルではないアプリケーションを使用する場合は、QtをQThreadsおよびQThreadPoolとともに使用します。

  1. すべてのオペレーティングシステムで100%同じ
  2. 必要なコードははるかに少なくなります

「低レベル」のアプリケーションを作成する場合は、アプリケーションをバックエンドとフロントエンドに分割し、OSごとに独自のバックエンドを作成して、問題の少ないライブラリを使用することをお勧めします。

于 2014-02-22T19:02:07.013 に答える