私は C/C++ クロスプラットフォーム コードを開発しています。最後のプラットフォームは Itanium ベースの HP-UX です。関連するマシンとプロセッサの情報は、質問の最後にあります。
以下に示すマシンとコンパイラの仕様に対して、アトミックな比較と交換を実装または検索する必要があります。
解決策のいくつかの可能性を見つけましたが、それらの使用方法を見つけることができませんでした。
最初に考えられる解決策は、_Asm_cmpxchg (ドキュメントはこちら) を使用することです。これに含めるヘッダーや、コンパイルする方法がわかりません。
2 番目に考えられる解決策は、cmpxchg および cmpxchg8b コマンドを直接使用して独自のインライン アセンブリを作成することですが、これを正しく行う方法を見つけることもできませんでした。さまざまなリソースを見つけましたが、そのほとんどはアセンブリを直接記述しており、必要なプロセッサ アーキテクチャ用ではないか、具体的な例が十分に示されていません。
cmpxchg と cmpxchg8 の命令 (および tzcnt と lzcnt の 2 つはあると便利ですが、必須ではありません) に関するドキュメントをさらに見つけました。Google Chrome で表示している場合、ページの絶対値は cmpxchg では 234、cmpxchg8 では 236 です。
制限:私には制御できない制約があるため、サード パーティのライブラリを使用できません。
uname -smr の結果: HP-UX B.11.31 ia64
プロセッサ モデル:インテル(R) Itanium(R) プロセッサ 9340
コンパイラ -v: aCC: HP C/aC++ B3910B A.06.28
更新: _Asm_cmpxchg をコンパイルすることができましたが、動作していないようです (値は変更されません)。パラメータとして、_Asm_sz には _SZ_W、_Asm_sem には _SEM_ACQ、_Asm_ldhint には _LDHINT_NONE、r3 には元の 32 ビット整数値へのポインタ、r2 には目的の新しい値を渡しました。ドキュメントが非常に不十分であることを考えると、パラメーターの意味を推測しています。