カスタム ネットワーク プロトコル ライブラリを使用しています。このライブラリは TCP/IP 上に構築されており、高頻度のメッセージングで使用されると想定されています。これはノンブロッキング ライブラリであり、呼び出し元と統合するためのインターフェイスとしてコールバックを使用します。
私はパフォーマンスの専門家ではないので、ここでこの質問をすることにしました。カスタム ライブラリには、以下に概説する特定の制約があります。
「呼び出し先は、コールバック スレッドのコンテキストでライブラリの API を呼び出さないでください。そうしようとすると、スレッドがハングします」
API の制限を克服する唯一の方法は、メッセージを処理し、ライブラリを呼び出して応答を送信する別のスレッドを開始することです。ライブラリ スレッドとプロセス スレッドは共通のキューを共有し、ミューテックスによって保護され、wait_notify()
呼び出しを使用してメッセージの存在を示します。
1 秒あたり 80,000 件のメッセージを受信している場合、スレッドをスリープ状態にしてかなり頻繁に起動し、1 秒あたり最大 80,000 回スレッド コンテキスト スイッチを実行します。
さらに、2 つのスレッドがあるため、L1 キャッシュ内のメッセージ バッファーを共有しません。メッセージを含むキャッシュ ラインは、最初にライブラリのスレッドによって埋められ、次に削除され、プロセス スレッドのコアの L1 キャッシュに取り込まれます。何か不足していますか、それともライブラリの設計が高パフォーマンスのユースケース向けではない可能性がありますか?
私の質問は次のとおりです。
「ロックが発生する可能性があるため、コールバックのコンテキストでこの API を使用しないでください」などの警告を見たことがあります。多くのライブラリにまたがっています。このような設計上の制約を引き起こす一般的な設計上の選択は何ですか? 同じスレッドがロックを複数回呼び出すという単純な問題であれば、再帰ロックを使用できます。これは再入可能の問題ですか? API 所有者が非再入可能 API を作成する原因となる問題は何ですか?
上記の設計モデルで、ライブラリ スレッドとプロセス スレッドが同じコアを共有し、結果としてキャッシュ ラインを共有できる方法はありますか?
sig_atomic_t
2 つのスレッド間でデータを共有するメカニズムとしてvolatile はどれくらい高価ですか?高頻度のシナリオで、2 つのスレッド間で情報を共有するための軽量な方法は何ですか?
ライブラリと私のアプリケーションは、C++ と Linux で構築されています。