この質問では、32 ビット アトミック整数から 64 ビット アトミック カウンタを作成する方法について詳しく説明します。カウンタには単一のライターと複数のリーダーがあり、ライターはブロックしてはならないシグナル ハンドラーです。
提案されたソリューションでは、下位ビットを読み取りロックとして使用し、世代カウントを採用しています。読み取り全体で世代数が安定し、下位ビットが設定されなくなるまで、リーダーは再試行します。
提供されるコードは通常、既知の SeqLock の正しい設計原則に従っています。シーケンス番号を使用してロックフリーのアトミック カウンタを実装するためのパターン。メモリ順序付けの使用は適切であり、カウンタがアトミックに更新されることが保証されます。
ただし、ペイロードの増加にアトミック RMW 操作を使用する必要がないことは注目に値します。システムは、より安価な 64 ビットのアトミックな追加またはロードをサポートします。代わりに、両方の半分を単純にロードし、その後に非アトミックなインクリメントを行い、その結果をアトミックに保存するだけで十分です。
さらに、シーケンス カウンターは、スピンロックとして使用されない限り、アトミックな RMW 操作を回避することもできます。複数の作家。単一のライターを使用すると、リリース順序による純粋なロードと純粋なストアを使用できます。これは、アトミック RMW または seq_cst 順序によるストアよりも効率的です。
の制限をバイパスするにはアトミック
もう 1 つの代替方法は、ターゲットがアトミック
結論として、提供されたコードは 32 ビット アトミックを使用した 64 ビット アトミック カウンタの機能的な実装を示していますが、これらは、パフォーマンスを向上させ、コードを簡素化できる可能性のある最適化および代替案です。
以上が32 ビット アトミックのみを使用して 64 ビット アトミック カウンターを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。