2011-07-12 10 views
2

68kの古き良き時代では、スタックポインタと他のより汎用的なアドレスレジスタとの間の比較的一般的な関係のため、プリ/ポストポインタのインクリメント/デクリメントは多かれ少なかれアトミックであることが保証されていました。この動作は明らかに代替プラットフォーム上で最も効率的な実装を獲得できないかもしれない68kの人工物であるため、C仕様がこれらの操作の「アトミック性」に関して何の主張もしていないと仮定して正しいでしょうか?原子の前後のインデクシングの下限は?

+0

C仕様のどれも、_any_操作のアトミック性について何も主張していません。 – Nemo

+1

@Nemo:C1xは、新しいアトミック操作のアトミック性を保証します。 – ninjalj

+0

私はC自体からの保証はないと思う。 (少なくとも、ポインタのインクリメントでは++ ptrのようなものではない)しかし、多くの場合、実際の結果は実際にはアトミックです。関連する議論については、http://stackoverflow.com/questions/879077/is-changing-a-pointer-considered-an-atomic-action-in-cを参照してください。 – shelleybutterfly

答えて

4

私はC仕様がこれらの操作の「アトミック性」についての主張をしていないと仮定して正しいと思いますか?

はい。現在の標準(C99とC89、IIRCの両方)は、アトミック性については何の主張もしていない。これは間違いなくプラットフォーム固有であり、おそらくコンパイラにも依存します。

私が尋ねることができるのであれば、なぜこれらの操作がアトミックである必要がありますか?

+0

答えRafeのおかげで;ちょうど私が探していた情報。古い68kシステムのアセンブリー出力を調べるとき、 "move.l d1、(a3)+"のような命令は、書き込みとポインターのインクリメントの原子的性質のためにマルチプロセス実装に適していました。ここ10年間で私の組立スキルがやや低下してきたので、「* a3 ++ = d1」に何らかの保証が付いているかどうか疑問に思った。 – Taliadon

+0

@ Taliadonああ、そうです。あなたのコードが特定のOSや特定のコンパイラを持つ特定のアーキテクチャでのみコンパイルされることを知っているなら、アセンブリの出力を確認することができますが、それは価値があるよりも面倒です。 –

+0

LOL、あなたは正しいと思います。フォーラムにあるいくつかの追加情報を読んだ後、私は現在のスキルが課題に合っているとは思っていません。それは私がそうでないと仮定するのが簡単になります。再び、情報をありがとう、それは非常に感謝しています。 – Taliadon

0

標準の指定とは無関係に、 "巨大な"ポインタの80x86ポインタの算術と代入はアトミックではありませんでしたが、ポインタのインクリメントとアサインメントはすべてのプラットフォームでアトミックリードとアトミックライトで構成されます。 32ビット以上ですまたはここで、ポインタは 'int'と同じサイズです(一部の組み込みプラットフォームには16ビットint、24ビットポインタなどがあります)。ただし、マルチプロセッサアーキテクチャ上では、リードモディファイライトシーケンスはほとんど決して原子単位を形成しません。

0

明示的に文書化されていない限り、原子性の保証はありません。現行のC標準の下では、の可搬性コードで原子性を保証できることを意味します。原子オペレータは必ずプラットフォーム固有です。

@ninjaljは彼のコメントに注意しているように、C1xはアトミック演算子を追加します。

1

C標準には原子操作は全くありません。しかし、いくつかのGCC組み込み関数described hereがあり、C++0X stanardにいくつかのものがあります。また、コード内でPOSIXや他のマルチスレッドライブラリやインラインアセンブラを使用することもできます。

関連する問題