一部のWindows C++コードをiOSに移植する際に、Win32のlong InterlockedIncrement(long *p)
呼び出しの実装を提供する必要があります。これは、<libkern/OSAtomic.h>
で定義されている関数を使用すれば十分です。C++ 11 <atomic>を使用して整数へのポインタのアトミックなインクリメントを実装する方法は?
しかし、C++ 11の機能(主に<atomic>
)を使用してOSに依存しない方法で書くことができるかどうかは疑問です。
inline long InterlockedIncrement(long* p)
{
std::atomic<long&> atomicP(*p);
return ++atomicP;
}
は、この作業を行います:私は、私はわからないこれは私が欲しいものを達成し、これを思いつきましたか?それで十分ですか? 2つの行はアトミックではありませんが、インクリメントはアトミックでなければなりません。
私が見つけた<atomic>
の使用例はすべて異なります。std::atomic<T>
が定義され、直接使用されています。ここでは、発信者がアドレスで私に渡す既存の長い変数を使用したいと思います。私はそのような例を見つけることができませんでした。
編集:クラン3.2(Xcodeの4.xのは、)(どちらかでもatomicP += 1
)エラー「タイプstd::atomic<long&>
の値をインクリメントすることはできません」と++atomicP
のコンパイルに失敗しました。
正しい方法は何ですか?
編集再び:、ポインタの実装は...
inline long InterlockedIncrement(long* p)
{
std::atomic<long*> atomicP(p);
return ++(*atomicP);
}
をコンパイルしかし、私は、原子の種類が、ポインタが指す値をインクリメントしていないので、私は、これは動作しません怖いですこれは原子ではない。
私はあなたが 'アトミック'を持つことはできないと思います。ポインタのバージョンが間違っています(格納されているポインタ自体は、指し示された値ではなく、アトミックになります)。 –
interjay
いいえ、これは実装固有のものなしではまったく動作しません。 –
ポートの 'std :: atomic'に変換するのは時間でしょうか? WindowsとOSXでは 'long 'のサイズが異なることを考慮すると、おそらく何らかのOS固有の処理を行わなければならないでしょう。 –