アプリケーションが特定のプロトコル (実際には FastCGI) を使用するのに役立つライブラリを Linux の C++ で作成したいと考えています。ライブラリはソケット (TCP または Unix) をリッスンし、リクエストを受信してユーザー コードに転送し、ユーザー コードによって生成されたレスポンスを送信します。
ソケットには多くの接続があり、各接続は多くの要求を運びます (おそらく同時に - インターリーブ メカニズムがあります)。ユーザー コード (ライブラリを使用する) は、複数の要求を並行して処理するためにマルチスレッド化される可能性が高くなります。
ライブラリを堅牢にして、使用するマルチスレッドの種類を含め、ユーザー コードに関する想定や要件をできるだけ少なくしたいと考えています。私が理解しているclone()
ように、Linuxの関数は、共有メモリ、共有ファイルハンドルなどの有無にかかわらず、数十の異なる方法でプロセスをフォークできます。マルチスレッドを実装する方法の決定は、ユーザーに任せるべきです。
そして、これは私を混乱させます。なぜなら、ライブラリ コードが突然fork()
'ed' になっていることに気づき、コードの複数のコピーが突然同じソケットから読み取られ、同じ要求を処理する可能性があるからです。さらに悪いことに、親プロセスが終了し、子プロセスだけが残り、それがさらに多くの子プロセスを、おそらく別のプロセス名前空間で生成する可能性があります。これは混乱です。
同じ外部リソース (ソケット) にアクセスする必要がある同じコードのすべてのコピーを調整するのに役立つ Linux 機能は何ですか? そのようなスレッドセーフなライブラリを実装する標準的な方法は何ですか? 自分でスレッド モデルを選択し、それをライブラリの利用者に課す必要がありますか?