InterlockedCompareExchange Android崩溃问题

本杰明·埃尔南德斯(Benjamin Hernandez)

我正在尝试使用c ++(本机)为64位处理器运行android应用程序,执行这些功能时遇到崩溃问题(总线错误)

    // 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)

我阅读了有关这些功能的一些信息,它似乎仅适用于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;
}

现在,即使我使用新功能获得了相同的值,我的应用程序中也会出现一些引用错误和奇怪的行为,知道吗?

佩特·乔特

在某些平台上,我想这是常有的事,总线错误通常意味着您具有未对齐的访问权限(在您的情况下,您的32位或64位原子整数变量之一未对齐4或4)。分别为8个字节的边界。)

例如,以下是明确未对齐的原子访问:

#include <atomic>
#include <string.h>

int main()
{
   char buf[16];
   memset( buf, 0, sizeof(buf) );

   std::atomic<int> * pi = (std::atomic<int> *)(((intptr_t)buf & ~3) + 5);

   pi->fetch_add(1);

   return 0;
}

即使这样的代码似乎可以工作(即不使用SIGBUS或SIGSEGV捕获),如果未对齐的原子被不同的线程并发访问,那么它们也不会以预期的方式工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Visual Studio无法解析的符号_InterlockedCompareExchange

来自分类Dev

Android Fabric 崩溃问题

来自分类Dev

Delphi [volatile]和InterlockedCompareExchange不可靠吗?

来自分类Dev

Delphi [volatile]和InterlockedCompareExchange不可靠吗?

来自分类Dev

错误地使用 InterlockedCompareExchange 以原子方式复制值?

来自分类Dev

Android中的片段旋转崩溃问题

来自分类Dev

Android ListView适配器崩溃问题/重复项

来自分类Dev

片段中的意图不断与清单,android studio 崩溃问题

来自分类Dev

滚动查看应用程序崩溃导致Titanium Android问题崩溃

来自分类Dev

BootStrap Navbar崩溃问题

来自分类Dev

如果应用在Android中崩溃,该如何解决该问题?

来自分类Dev

Android:西班牙语:解析浮点值时出现问题:应用程序崩溃

来自分类Dev

如何解决运行Android 11(SDK 30)的应用程序中的崩溃问题

来自分类Dev

如何解决在Android Studio 4中启动时崩溃的问题?

来自分类Dev

关于带有动作栏的2.3 android版本中的崩溃应用程序的问题

来自分类Dev

新手Android 4.4 Hello Word应用崩溃问题-按钮单击更改/更新TextView

来自分类Dev

使用Rhodes的IOS 8.X和Android 5出现崩溃问题

来自分类Dev

Android 实时图形应用程序崩溃。可能的多线程问题

来自分类Dev

当我单击按钮时,Android 应用程序崩溃,onClickListener 出现问题

来自分类Dev

在项目中添加包后,android 没问题,但在 flutter 启动期间 ios 崩溃

来自分类Dev

出现问题(链接,崩溃)

来自分类Dev

Ubuntu 13.10:VirtualBox崩溃问题

来自分类Dev

MPMediaItemPropertyArtwork导致崩溃(奇怪的问题)

来自分类Dev

SSD Windows 10崩溃问题

来自分类Dev

QTimer Cashing Python崩溃的问题

来自分类Dev

ABRecordCopyCompositeName 和 CFBridgingRelease 崩溃问题

来自分类Dev

Unidentified CFRunLoopRun 崩溃报告问题

来自分类Dev

Ubuntu 13.10:VirtualBox崩溃问题

来自分类Dev

Android Vector Drawable崩溃

Related 相关文章

  1. 1

    Visual Studio无法解析的符号_InterlockedCompareExchange

  2. 2

    Android Fabric 崩溃问题

  3. 3

    Delphi [volatile]和InterlockedCompareExchange不可靠吗?

  4. 4

    Delphi [volatile]和InterlockedCompareExchange不可靠吗?

  5. 5

    错误地使用 InterlockedCompareExchange 以原子方式复制值?

  6. 6

    Android中的片段旋转崩溃问题

  7. 7

    Android ListView适配器崩溃问题/重复项

  8. 8

    片段中的意图不断与清单,android studio 崩溃问题

  9. 9

    滚动查看应用程序崩溃导致Titanium Android问题崩溃

  10. 10

    BootStrap Navbar崩溃问题

  11. 11

    如果应用在Android中崩溃,该如何解决该问题?

  12. 12

    Android:西班牙语:解析浮点值时出现问题:应用程序崩溃

  13. 13

    如何解决运行Android 11(SDK 30)的应用程序中的崩溃问题

  14. 14

    如何解决在Android Studio 4中启动时崩溃的问题?

  15. 15

    关于带有动作栏的2.3 android版本中的崩溃应用程序的问题

  16. 16

    新手Android 4.4 Hello Word应用崩溃问题-按钮单击更改/更新TextView

  17. 17

    使用Rhodes的IOS 8.X和Android 5出现崩溃问题

  18. 18

    Android 实时图形应用程序崩溃。可能的多线程问题

  19. 19

    当我单击按钮时,Android 应用程序崩溃,onClickListener 出现问题

  20. 20

    在项目中添加包后,android 没问题,但在 flutter 启动期间 ios 崩溃

  21. 21

    出现问题(链接,崩溃)

  22. 22

    Ubuntu 13.10:VirtualBox崩溃问题

  23. 23

    MPMediaItemPropertyArtwork导致崩溃(奇怪的问题)

  24. 24

    SSD Windows 10崩溃问题

  25. 25

    QTimer Cashing Python崩溃的问题

  26. 26

    ABRecordCopyCompositeName 和 CFBridgingRelease 崩溃问题

  27. 27

    Unidentified CFRunLoopRun 崩溃报告问题

  28. 28

    Ubuntu 13.10:VirtualBox崩溃问题

  29. 29

    Android Vector Drawable崩溃

热门标签

归档