複数のコンパイラ間で移植可能な、さまざまなプロセッサのCASのような操作をマクロまたは関数にラップする小さなライブラリはありますか?
PS。atomic.hppライブラリ は、boost :: interprocess :: detail名前空間内にあります。著者は、よく整備された公開ライブラリにすることを拒否しています。
質問を再度開き、他のオプションがあるかどうかを確認しますか?
Intel Threading Building Blocks は、移植性の高いatomic<T>
必要なことを行うテンプレート。しかし、それが小さな図書館であるかどうかはもちろん議論の余地があります。
OPA(Open Portable Atomics)は、ニーズに最適です。 https://trac.mcs.anl.gov/projects/openpa/
MITスタイルのライセンスの下で、複数のプラットフォームにわたる一般的なアトミック操作に一貫したC APIを提供します。ライブラリは小さく、サイズ要件を確実に満たします。現在のプラットフォームリストは次のとおりです。
私はC++プログラムでこれを使用したことはありませんが、ほとんどまたはまったく変更せずに動作するはずです。問題が発生した場合は、微調整させていただきます([email protected]にメールを送信してください)。
ブーストプロセス間ライブラリはあなたが求めているものかもしれません-Atomic.hppインクルードファイルには、さまざまなプラットフォームとコンパイラの比較とスワップの実装が含まれています。
Glibのアトミック操作 関数に興味があるかもしれません。
g_atomic_int_compare_and_exchange()
さまざまなアーキテクチャのCASセマンティクスを実装します。実装自体は比較的理解しやすく、あまり手間をかけずにスタンドアロンで使用できます。svn.gnome.org/ viewvc /のglib/trunk/glib/gatomic。{c、h}にあります。お役に立てれば!
Mac OS XとWindowsには、とにかく使うべき組み込みのCompareAndSwap関数があります(それぞれInterlockedCompareExchange()とOSAtomicCompareAndSwapPtrBarrier())。したがって、これらのプラットフォームのコンパイラに関係なく動作します。
他のUnixでは少しトリッキーですが、GCC 4.1以降を使用している場合は、組み込みの__sync_val_compare_and_swap()を使用できます。ただし、すべてのUNIXコンパイラが妥当なgcc拡張をサポートしているわけではありません。 。
したがって、OS XとWindowsのすべてのプロセッサのほとんどすべてのコンパイラ、およびGCCと他のプラットフォームの他のコンパイラで機能する方法でそれらをラップしたい場合は、次のようにする必要があります。
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
return OSAtomicCompareAndSwapPtr (old_value, new_value, ptr);
#Elif defined(_MSC_VER)
return InterlockedCompareExchange(ptr, new_value, old_value);
#Elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_val_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
これはテストされていませんが、正しいはずです。すべてのOSライブラリがどのように引数を異なる順序で受け取るかに注意してください;-)
必要に応じて、サイズの異なる比較用にいくつかのバージョンを実行し、スワップしてテンプレートにラップすることができます。 APIは主にCベースであり、型情報を関数にエンコードして、テンプレートを介して型をパラメーター化するのに慣れているユーザーにとって一種の厄介なものにします。
Boehmによる atomic_ops プロジェクトのライブラリがあります。けれども免許についてDunnoは。
提案されたC++ 0x互換のBoost Atomicsライブラリがあります: http://www.chaoticmind.net/~hcb/projects/boost.atomic/
このライブラリの目的は、C++ 0xドラフト標準で指定されたインターフェースに基づいて、ブースト用のアトミック操作の実装を提供することです。 std :: atomicへの移行を簡単にすること、およびこのC++ 0x機能を使用するコードを古いシステムでコンパイルできるようにすることを目的としています。
これは明らかにBoostの一部ではありませんが、こちらのレビュースレッドをチェックできます: http://lists.boost.org/Archives/boost/2009/12/160195.php
Boost.Atomicは、リリースと呼べる形式になりました。以下の「真の」アトミック変数をサポートしています。
- gcc/x86、32ビット(Linux、FreeBSDでテスト済み)
- gcc/x86、64ビット(Linuxでテスト済み)
- gcc/powerpc32(Linux、Mac OS Xでテスト済み)
- gcc/powerpc64(テストされていない)
- 汎用Win32(Win XPのVisual Studio Expressでテスト済み)
他のすべての場合は、ロックされた操作に正常にフォールバックします。うまくいけば例示的な例のセクションを含む、適切なクイックブックのドキュメントがあります。
著者が(あなたが提供したリンクで)言ったのは、「公式のBoostライブラリが来るまで、安全に使用できると思います」です。 「アトミック関数がC++ 0xに存在するとき」までインターフェースの変更を延期する。
今日使用するものは何であれ、とにかく利用可能になったときに、新しいstd::
機能に移行することになるでしょう。
ブーストのものは一般的にかなり良いですが、リリースされたブーストライブラリの実装で使用されているように見えます。また、その実装を数回使用したくなりました。
私はそれのために行きます。
また、 http://www.ioremap.net/node/224 からインスピレーションを得るためにlibsyncを調べることもできます。これは非常に新しい(多すぎるかもしれません)ですが、Elliptics Networkで使用されているため、 (いくつか?)テストを取得します。
また、CASの隣に高レベルのプリミティブ、RCU(Read Copy Update)があり、スレッド間のロックレス同期が可能です。
しかし、それは「移植可能」という意味に依存します。アーキテクチャx86とPPC、OS、Linux、FreeBSD、OpenBSD、Solaris、MacOSXをサポートしますが、Windowsはサポートしません。
そして、ライセンスはGPLであり、これは嫌いまたは愛することができます。