unix多线程问题

q394944800 2010-12-15 06:24:29
今天将一个多线程程序由linux移植到AIX Unix遇到问题,Linux下运行程序正常,但unix下却coredump了,用dbx分析,发现其中有个函数,定义了结构体变量,其空间为129080,如果将该结构体空间改成100,程序能通过。问题:AIX中多线程是不是有什么限制,如栈空间?为啥Linux就可以?

附上:
Segmentation fault in fc_pkg2 at 0x1000207c ($t2)
0x1000207c (fc_pkg2+0x24) 7c21616e stwux r1,r1,r12

(dbx) where
fc_pkg2() at 0x1000207c
test_pthread(data = (nil)), line 29 in "cdb_main.c"
(dbx) x
$r0:0x100038a4 $stkp:0x30006230 $toc:0x300008e0 $r3:0x30006280
$r4:0x30047458 $r5:0x30047408 $r6:0x00000000 $r7:0x30000658
$r8:0x1028c16b $r9:0x1028c16b $r10:0x00000000 $r11:0x00000000
$r12:0xfffe0550 $r13:0x00000000 $r14:0x00000000 $r15:0x00000000
$r16:0x00000000 $r17:0x00000000 $r18:0x00000000 $r19:0x00000000
$r20:0x00000000 $r21:0x00000000 $r22:0x00000000 $r23:0x00000000
$r24:0x00000000 $r25:0x00000010 $r26:0x30047408 $r27:0x100074c4
$r28:0x10007028 $r29:0x00000000 $r30:0x300062b8 $r31:0x30006280
$iar:0x1000207c $msr:0x0000d032 $cr:0x42000224 $link:0x100038a4
$ctr:0xd0132880 $xer:0x20000017 $mq:0x00000000
Condition status = 0:g 1:e 5:e 6:e 7:g
[unset $noflregs to view floating point registers]
[unset $novregs to view vector registers]
in fc_pkg2 at 0x1000207c ($t2)
0x1000207c (fc_pkg2+0x24) 7c21616e stwux r1,r1,r12
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeunix_aa 2011-11-21
  • 打赏
  • 举报
回复
正好碰到这样的问题,让人茅舍顿开啊
xueshanshouwangzhe 2011-10-24
  • 打赏
  • 举报
回复
凑字看回复
q394944800 2010-12-16
  • 打赏
  • 举报
回复
非常感谢huangwj333的解答,问题已解决,其原因应该是AIX线程栈空间太小了,用AIXTHREAD_STK=sizeexport AIXTHREAD_STK 设置了大小,程序可以正常运行。
huangwj333 2010-12-15
  • 打赏
  • 举报
回复
好像缺省栈空间是8k呢?

AIX线程支持可调参数(
http://ebsblog.blog.163.com/blog/static/127949789200981533034710/
)

AIXTHREAD_STK=n(带有 4330-09 推荐维护包的 AIX 及更高版本)
用途: 十进制字节应该分配到每个 pthread。此值可由 pthread_attr_setstacksize 例程覆盖。
值: 缺省值:对于 32 位应用程序为 98 304 字节,对于 64 位应用程序为 196 608 字节。范围:0 到 268 435 455 的十进制整数值,并且该值将向上取整到最接近的页(目前为 4 096)。
显示: echo $AIXTHREAD_STK
此参数内部开启,因此初始缺省值无法通过 echo 命令看到。

更改: AIXTHREAD_STK=sizeexport AIXTHREAD_STK
更改会在该 shell 中立即生效。在从这个 shell 注销之前更改一直有效。将 AIXTHREAD_STK=size 命令添加到 /etc/environment 文件中可进行永久性更改。

诊断: 如果失败程序的分析结果是由于堆栈溢出,缺省的栈大小应该增加。
调整: 如果尝试达到 32 位应用程序上的 32 000 线程限制,那么有必要减小缺省堆栈大小。
huangwj333 2010-12-15
  • 打赏
  • 举报
回复
是否和链接了非线程安全的链接库有关系呢?
huangwj333 2010-12-15
  • 打赏
  • 举报
回复
有意思,我也想知道。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧