求救:AIX 4.3上用pthread_create创建线程时居然随机地非法操作?

Netguy 2003-11-27 03:29:23
双CPU的机器。主程序先用setitimer()启动了定时器,然后在SIGALRM信号的处理函数中定时用pthread_create函数创建一个新的线程去处理某些任务。结果发现pthread_create()调用本身会随机地非法操作(即在第X次调用该函数时非法操作)。线程函数在入口处已经用mutex做了同步,防止线程函数重入。

gdb显示出非法操作时的堆栈如下。看起来是pthread_create函数内部在锁定资源时出错。不知如何解决?

Program terminated with signal 11, Segmentation fault.
#0 0xd0019428 in spin_lock_global_ppc_mp ()
(gdb) bt
#0 0xd0019428 in spin_lock_global_ppc_mp ()
#1 0xd0179f88 in __heap_lock ()
#2 0xd017b61c in malloc ()
#3 0xd000a200 in _pthread_alloc ()
#4 0xd000d1e0 in pthread_create ()
#5 0x10000ba8 in _Z15SigAlarmHandleri (signo=14) at main.cpp:111
#6 <signal handler called>
#7 0xd0012908 in _vp_sleep ()
#8 0xd0010fec in _usched_dispatch ()
(gdb)

SIGALRM信号的处理函数如下:

void SigAlarmHandler(int signo)
{
static unsigned long SecondCounter = 0x7FFFFFFF, MinuteCounter = 0x7FFFFFFF;
int ret;

SecondCounter++;
if (SecondCounter >= 10)
{
SecondCounter = 0;

pthread_t tid1;
ret = pthread_create(&tid1, NULL, SendPerfDataProc, NULL);
if(ret)
{
TRACE("can't create SendPerfDataProc thread.\n");
return;
}
ret = pthread_detach(tid1);
}
...全文
83 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Netguy 2003-11-27
  • 打赏
  • 举报
回复
好办法。

我按你说的修改成类似的机制,好像也OK了:

SIGALRM信号处理函数只设置标记,然后在主线程中检测到标记则创建新线程。

看来信号处理函数确实很受限制。
linaxing 2003-11-27
  • 打赏
  • 举报
回复
看不出什么问题。
我们以前处理这样的问题是这样:
用两条线成,两条线成之间用一个管道通信,
一条计时:用while循环,用select()睡眠,每循环一次,向管道中写入一个字符
另一条用select()监听管道数据,如果有数据到达,则执行相应的操作。

这种方法不使用信号。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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