私たちが持っている場合:
__int32 some_var = 0;
を呼び出すための最良の(もしあれば)方法InterlockedExchange
、InterlockedIncrement
およびを必要とする他のインターロックされた関数LONG*
はsome_var
何ですか?
LONG
どのWindowsでも32ビットであることが保証されているので、渡すだけでおそらく安全(long*) some_var
です。しかし、私にはかなり醜いようで、安全であるという確認を見つけることができません。
long
ポータブルではないため、タイプをに変更することはできません。正確に32ビットタイプが必要です。
更新:移植可能な不可分操作を提供するライブラリのいくつかの研究は、誰もキャストについて気にしないことを示しました。いくつかの例:
typedef WINBASEAPI apr_uint32_t (WINAPI * apr_atomic_win32_ptr_val_fn)
(apr_uint32_t volatile *,
apr_uint32_t);
APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, apr_uint32_t val)
{
#if (defined(_M_IA64) || defined(_M_AMD64))
return InterlockedExchangeAdd(mem, val);
#elif defined(__MINGW32__)
return InterlockedExchangeAdd((long *)mem, val);
#else
return ((apr_atomic_win32_ptr_val_fn)InterlockedExchangeAdd)(mem, val);
#endif
}
AO_INLINE AO_t
AO_fetch_and_sub1_full (volatile AO_t *p)
{
return _InterlockedDecrement64((LONGLONG volatile *)p) + 1;
}