C スレッドでのマルチバイト整数へのアトミック アクセス: 微妙な答え
マルチスレッド アプリケーションでは、共有データへのアクセスを調整することで、挑戦的であること。 C での整数の読み取りと書き込みがアトミックであるかどうかについて考えてみましょう。
問題
2 つのスレッド (整数値を更新するスレッドと整数値を読み取るスレッド) を想像してください。通常、読み取りと書き込みの順序は、この統計値にとって重要ではありません。ただし、書き込み操作中の潜在的な中断に関する懸念が生じます。
たとえば、0x0000FFFF に初期化された値を考えてみましょう。 0x00010000 に増加した場合、問題を引き起こす可能性のある中間状態 0x0001FFFF のリスクはありますか?
答え: アーキテクチャに関する考慮事項
答えはアーキテクチャにありますシステムの。 IA32 プロセッサでは、アライメントされたメモリへの書き込みはアトミックです。ただし、非整列書き込みはキャッシュ設定に基づいて動作が異なる場合があります。
CPU と RAM 間のバス幅もアトミック書き込みに影響します。たとえば、8086 プロセッサでの 16 ビット アラインメント書き込みはアトミックでしたが、8088 での同じ書き込みは 8 ビット バスによるものではありませんでした。
揮発性変数宣言
C では、共有変数を volatile として宣言することが重要です。これにより、コンパイラーが整数が決して更新されないと仮定して最適化することがなくなり、マルチスレッド シナリオでの正しい動作が確保されます。
結論
整数の読み取りと書き込みのアトミック性の決定C スレッドでは、ターゲット アーキテクチャとキャッシュ メカニズムを慎重に検討する必要があります。アライメントされていない書き込みやキャッシュ ライン分割の可能性があるシステムの場合、データの整合性を保証するために同期メカニズムが必要になる場合があります。
以上がマルチスレッド C では整数の読み取りと書き込みはアトミックですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。