5

InterlockedCompareExchangeWindows では、gcc と同様__sync_val_compare_and_swapにポインターを使用するため、共有メモリ ブロックを指すなど、任意のアドレスをそれらの関数に渡すことができます。

x86 以外のアーキテクチャでは、正確性のためにメモリ アライメントを確保する必要がある場合があり、x86 (およびその他のアーキテクチャ) では、パフォーマンスのためにキャッシュ ラインのアライメントを確保したい場合がありますが、正確性は問題にはなりません (-> x86LOCKプレフィックス) 。 .

コード内のプラットフォームに依存するもの (Windows VC++ と GCC) を取り除こうとして、C++11atomic_compare_exchange_weakとその仲間を調べました。しかし、それらはすべて type の変数で機能しますstd::atomic<T>*

C++11 のアトミック関数で任意のポインターを使用する方法はありますか? std::atomic への単純なキャストがこれを解決するようには見えません。

4

1 に答える 1

3

短い答え: 彼らはできません。これは、言語の移植性のために必要です。C++ では、すべてのプラットフォームが特定のデータ サイズのセットに対してロックフリーのサポートを必要とするわけではないためです。を使用すると、ライブラリが一部の s に対してロックフリーの原子性を透過的に提供し、他の s に対してロックを使用std::atomic<T>することが容易になりますT

明るい面としては、コードベースを に置き換えるTatomic<T>、同期に使用される正確なオブジェクトのドキュメントが提供され、それらのオブジェクトへの偶発的な非アトミック アクセスに対する保護が提供されます。

長い答え:reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)月の正しい段階で実際にいくつかの実装で機能する可能性がありますが、それは最も純粋な悪です.

于 2013-06-17T18:15:53.680 に答える