1

私はatomic_inc_64_nv64 ビット Solaris で使用しています。戻り値は unsigned long にキャストされます。しかし、アプリを実行するとクラッシュし、コアはクラッシュの原因が 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 プロセッサは非境界整列アクセスをサポートしていません。pullTarget8 バイトにアラインされていることを確認する必要があります。次のようなコードを追加して、それをキャッチできます。

if ((uint_ptr)pullTarget & 7) { printf("アライメントの問題 pullTarget = %p\n", pullTarget); }

于 2012-12-23T17:59:51.233 に答える
2

コアがあり、デバッガーで開いたので、変数に含まれる値を出力するだけですpullTarget。@MatsPeterssonが原因で正しいため、8で割り切れないことがわかります。

于 2012-12-23T18:11:34.377 に答える