免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4836 | 回复: 4
打印 上一主题 下一主题

求助:在pthead线程中使用localtime_r出错,请各位大侠帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-07-12 20:34 |只看该作者 |倒序浏览
我在 SUN880 Solaris8上开发了一个多线程程序,使用pthread线程,用 cc 编译器进行编译。
  程序的线程结构是这样,主线程启动后创建了4个 pthread 线程,这四个 pthread 线程一直运行,直到进程结束才退出。因为需要在多个线程中同时获取系统时间,所以程序中使用了 localltime_r 函数。各个线程中对 localltime_r 的调用频度很高,每秒平均 200 多次,现在发现这样的问题,程序运行起来后,10几秒很快出现内存访问错误。用dbx查看core文件后发现错误出现在子线程,即主线程创建的pthread线程中对localltime_r的调用点上。
  我把子线程中对 localltime_r 的调用注释掉,只保留主线程中对 localltime_r 的调用,编译后程序稳定运行。但只要一打开子线程中对 localltime_r 的调用,同样的内存访问错误就出现在子线程中 localltime_r 的调用点上。偶尔的几次还会出现该子线程的堆栈被破坏,出错点不明的情况。
  我怀疑该错误情况是不是与 Solaris 下对 pthread 的实现有关,因为主线程中的调用没有出错。
  查了一天没有找到原因,请各位大侠帮忙。

论坛徽章:
0
2 [报告]
发表于 2004-07-13 07:53 |只看该作者

求助:在pthead线程中使用localtime_r出错,请各位大侠帮忙!

SUN 最早实现pthread,我觉得一般有问题都是自己问题。
贴出你相关代码?

论坛徽章:
0
3 [报告]
发表于 2004-07-13 09:37 |只看该作者

求助:在pthead线程中使用localtime_r出错,请各位大侠帮忙!

以下的代码段用于生成 pthread 子线程:
        pthread_attr_t                attr;
        pthread_t                ptid;
       
        pthread_attr_init(&attr);

        /* 设置堆栈大小*/       
        if(stackSize < MIN_STACK_SIZE)
                stackSize = MIN_STACK_SIZE;

        if(pthread_attr_setstacksize(&attr,stackSize) != 0)
        {
                printf("utaskSpawn failed:reason=1,stacksize=%d.\r\n",stackSize);
                return -1;
        }
       
        if(pthread_create(&ptid,&attr,entryPt,(void *)arg) != 0)
                return -1;

以下代码段在线程中调用 localtime_r函数:
        time_t utm;
        struct tm tmpTm;
                :
                :
        /*得到一个UNIX标准时间值存入utm中*/
                :
                :
        localtime_r(&utm,&tmpTm);

        我这里为了简明,做了一点修改,原程序中对localtime_r在封装在另一个函数中,相当于utm和tmpTm位于不同的函数堆栈中,不知道这有没有影响。
        这段代码能在程序启动后成功执行将近10秒,然后就在localtime_r的调用点上发生内存错误。
        我的程序编译和链接是分开的,
        编译选项:cc -c -g -o file.c file.c

论坛徽章:
0
4 [报告]
发表于 2004-07-13 11:47 |只看该作者

求助:在pthead线程中使用localtime_r出错,请各位大侠帮忙!

看看这篇文章好像是讲这个的。

mktime和localtime_r能在多线程环境下使用么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2008-09-25 11:05 |只看该作者
The mktime() function is MT-Safe in multithreaded applications, as long as no user-defined function directly modifies one of the following variables: timezone, altzone, daylight, and tzname. See ctime(3C).

http://docs.sun.com/app/docs/doc ... ?l=zh_tw&a=view
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP