Если мы имеем:операции Win API ВЗАИМОСВЯЗАННОГО для 32-битного целого типа
__int32 some_var = 0;
Что является лучшим (если таковые имеются) способ вызова InterlockedExchange
, InterlockedIncrement
и другие сблокированные функции, которые требуют LONG*
для some_var
?
Поскольку есть гарантия, что LONG
- 32 бит на любой Windows, возможно, безопасно просто пройти (long*) some_var
. Тем не менее, мне кажется довольно уродливым, и я не могу найти подтверждения, что это безопасно.
Примечание. Я не могу изменить тип на long
, потому что он не переносится. Мне нужен ровно 32-битный тип.
Обновление: Некоторые исследования библиотек, которые обеспечивают переносные атомные операции, показали, что никто не беспокоится о литье. Некоторые примеры:
Apache Portable Runtime (APR):
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;
}
http://stackoverflow.com/questions/930897/c-atomic-operations-for-lock-free-structures http://stackoverflow.com/questions/523827/c0x-atomic-template-implementation –