一部の Windows C++ コードを iOS に移植する際に、Win32 のlong InterlockedIncrement(long *p)
呼び出しの実装を提供する必要があります。で定義されている関数を使用すると、これは簡単<libkern/OSAtomic.h>
です。
ただし、主にC++ 11の機能だけを使用して、OSに依存しない方法で記述できるかどうか疑問に思ってい<atomic>
ます。私はこれを思いつきましたが、私が望むものを達成できるかどうかはわかりません:
inline long InterlockedIncrement(long* p)
{
std::atomic<long&> atomicP(*p);
return ++atomicP;
}
これは機能しますか?それで十分ですか?2 つの行はアトミックではありませんが、インクリメントはアトミックにする必要があります。これがここで重要です。
私が見つけた使用例はすべて<atomic>
異なり、 astd::atomic<T>
が定義されて直接使用されています。ここでは、発信者がアドレスで渡す既存の long 変数を使用したいと考えています。そのような例は見つかりませんでした。
編集: Clang 3.2 (Xcode 4.x) は++atomicP
、「タイプの値をインクリメントできません」というエラーでコンパイルに失敗しますstd::atomic<long&>
(atomicP += 1
どちらも)。
正しい方法は何ですか?
もう一度編集: ポインターの実装がコンパイルされます...
inline long InterlockedIncrement(long* p)
{
std::atomic<long*> atomicP(p);
return ++(*atomicP);
}
しかし、アトミック型をインクリメントしないため、これは機能しないのではないかと思いますが、ポインターが指す値はアトミックではありません。