1

atomic_inc_64_nv在 64 位 Solaris 上使用,返回值被强制转换为无符号长。但是当我运行我的应用程序时,它崩溃了,核心声称崩溃的原因是 SIGBUS。我怀疑可能存在对齐问题。我该如何解决这个问题?

这是我使用增量的函数

    inline unsigned long long Increment64(volatile unsigned long long * pullTarget)
    {
#if defined(LINUX)
        return Add64(pullTarget, 1ULL);
#elif defined(SOLARIS)
        return atomic_inc_64_nv((volatile unsigned long *)pullTarget) - 1ULL;
#elif defined(WIN32)
        return (unsigned long long)InterlockedIncrement64((LONGLONG volatile*)(pullTarget)) - 1ULL;
#endif // defined(LINUX)
    }

提前谢谢你。

4

2 回答 2

4

Sparc 处理器不支持非对齐访问。您需要确保您pullTarget的对齐到 8 个字节。您可以添加一些这样的代码来捕获它:

if ((uint_ptr)pullTarget & 7) { printf("对齐问题 pullTarget = %p\n", pullTarget); }

于 2012-12-23T17:59:51.233 回答
2

由于您有一个核心并已在调试器中打开它,现在只需打印变量中包含的值pullTarget。(指针值本身,而不是它指向的值。)您应该看到它不能被 8 整除,因为@MatsPetersson 在原因上是正确的。

于 2012-12-23T18:11:34.377 回答