5

私が書いたコードを Mac OS X から Linux に移植しようとしていますが、OSX のみの適切な代替品を見つけるのに苦労していますOSAtomic.h。gcc__sync*ファミリーを見つけましたが、私が持っている古いコンパイラ/カーネルと互換性があるかどうかはわかりません。GCC v4.1.2 およびカーネル 2.6.18 で実行するコードが必要です。

私が必要とする特定の操作は次のとおりです。

  • インクリメント
  • デクリメント
  • 比較して交換

奇妙なのはlocate stdatomic.h、Linux マシンで実行するとヘッダー ファイル (c++ ディレクトリ内) が見つかるのに対し、私の OSX マシン (gcc v4.6.3) で同じコマンドを実行しても何も返されないことです。stdatomic ライブラリを入手するには何をインストールする必要がありますか? gcc v 4.1.2 で動作しますか?

ちなみに、サードパーティのライブラリは使用できません。

4

3 に答える 3

6

OSAtomic他のプラットフォームで操作を使用することを妨げるものは何もありません。ARM、x86、および PPCの操作のソースOSAtomicは、オープンソースである Apple の libc の一部です。OSSpinLockこれは Mac OS X に固有のものであるため、使用していないことを確認してください。ただし、これは Linux futex に簡単に置き換えることができます。

これらを参照してください。

http://opensource.apple.com/source/Libc/Libc-594.1.4/i386/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/ppc/sys /OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/arm/sys/OSAtomic.s

または、ファミリを使用することもできますsync_*。これは、ほとんどのプラットフォームで動作すると思われます。これについては、http: //gcc.gnu.org/wiki/Atomicで説明されていると思います。

于 2012-08-23T01:54:55.547 に答える
5

OpenPAプロジェクトは、MIT スタイルのライセンスの下で、アトミック操作のポータブル ライブラリを提供します。これは私が以前に使用したもので、かなり簡単です。操作のコードは次のようになります

#include "opa_primitives.h"

OPA_int_t my_atomic_int = OPA_INT_T_INITIALIZER(0);

/* increment */
OPA_incr_int(&my_atomic_int);

/* decrement */
OPA_decr_int(&my_atomic_int);

/* compare and swap */
old = OPA_cas_int(&my_atomic_int, expected, new);

また、完全なメモリ フェンスの代わりに、きめの細かいメモリ バリア (つまり、読み取り、書き込み、および読み取り/書き込み) も含まれます。

メイン ヘッダー ファイルには、ライブラリで使用できる操作を示すコメントがあります。

于 2012-08-23T02:13:38.390 に答える
4

GCC アトミック組み込み関数は、GCC 4.0.1 以降で使用できます。

GCC 4.7または Clang を GCC 4.1.2 でビルドし、 C11 アトミックなどのすべての新しい機能を取得することを妨げるものは何もありません。

最後の手段として、アトミックの BSD ライセンス アセンブラー実装を見つけることができる場所はたくさんあります。

于 2012-08-23T02:29:49.210 に答える