InterlockedCompareExchange Android проблема сбоев - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь запустить приложение для Android для 64-битных процессоров, используя c ++ (нативный), и когда я выполняю эти функции, у меня возникают проблемы при сбое (Ошибка шины)

    // returns the resulting incremented value
#define InterlockedIncrement(pInt)               __sync_add_and_fetch(pInt, 1)

// returns the resulting decremented value
#define InterlockedDecrement(pInt)               __sync_sub_and_fetch(pInt, 1)

// returns the initial value
#define InterlockedExchangeAdd(pInt,nAdd)        __sync_fetch_and_add(pInt,nAdd)

// returns the initial value of the pInt parameter.
#define InterlockedCompareExchange(pInt,nValue,nOldValue) __sync_val_compare_and_swap(pInt,nOldValue,nValue)

Iпрочитайте некоторую информацию об этих функциях, и кажется, что это работает только для 32-битных процессоров

Я попытался изменить вызов таким образом

#include <atomic>
#include <iostream>

inline BOOL InterlockedCompareExchange(volatile INT* pInt, INT nValue, INT nOldValue)
{
    std::atomic<INT>  ai;
    ai = *pInt; 
        return ai.compare_exchange_strong(nOldValue, nValue,
        std::memory_order_release,
        std::memory_order_relaxed);
}

inline LONG InterlockedExchange(volatile LONG* pInt, LONG nValue)
{
    std::atomic<LONG>  ai;
    LONG nOldValue;
    ai = *pInt;
    nOldValue = *pInt;
    while (!ai.compare_exchange_strong(nOldValue, nValue,
        std::memory_order_release,
        std::memory_order_relaxed));
    *pInt = nValue;
    return nValue;
}

inline LONG InterlockedIncrement(volatile LONG* pInt)
{
    std::atomic<LONG>  ai;
    ai = *pInt;
    ai.fetch_add(1, std::memory_order_relaxed);
    *pInt = ai;
    return ai;
}

inline LONG InterlockedDecrement(volatile LONG* pInt)
{
    std::atomic<LONG>  ai;
    ai = *pInt;
    ai.fetch_sub(1, std::memory_order_relaxed);
    if (ai < 0)
        ai = 0;
    *pInt = ai;
    return ai;
}

inline LONG InterlockedExchangeAdd(volatile LONG* pInt, LONG nValue)
{
    std::atomic<LONG>  ai;
    ai = *pInt;
    ai.fetch_add(nValue, std::memory_order_relaxed);
    if (ai < 0)
        ai = 0;
    *pInt = ai;
    return ai;
}

Теперь я получаю некоторые ошибки в ссылках истранное поведение в моем приложении, даже если я получаю те же значения, используя мои новые функции, любая идея?

...