我在64位Solaris上使用atomic_inc_64_nv
,返回值被转换为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)
}
先谢谢你。
答案 0 :(得分:3)
Sparc处理器不支持未对齐访问。您需要确保pullTarget
与8个字节对齐。您可以添加一些这样的代码来捕获它:
if((uint_ptr)pullTarget& 7) { printf(“对齐问题pullTarget =%p \ n”,pullTarget); }
答案 1 :(得分:2)
由于您有一个核心并已在调试器中打开它,现在只需打印变量pullTarget
中包含的值。 (指针值本身,而不是它指向的内容。)你应该看到它不能被8整除,因为@MatsPetersson在原因上是正确的。