找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5406|回复: 4

Semaphore acquire问题(貌似ACE的bug), 请大家帮忙测试一下

[复制链接]
发表于 2011-3-11 21:53:43 | 显示全部楼层 |阅读模式
本帖最后由 zhuliang 于 2011-3-15 12:46 编辑

请高手看看下面一段简单的程序:

#include <ace/Synch.h>
#include <iostream>
#include <time.h>
using namespace std;

main(int argc, char* argv[])
{
cout<<"start!!!"<<endl;
    struct tm utctm;
    time_t timeNow = time(NULL);
    gmtime_r(&timeNow, &utctm);

    ACE_Thread_Semaphore que(0);
cout<<"before acquire!!!"<<"  errno="<<ACE_OS::last_error()<<endl;
    int res = que.acquire();
cout<<"after acquire!!! res="<<res<<"  errno="<<ACE_OS::last_error()<<endl;
cout<<"err msg="<<ACE_OS::strerror(ACE_OS::last_error())<<endl;
}

调了gmtime_r后,再调semaphore acquire就有问题,如果没有gmtime_r,只调acquire就很好。这是ACE的bug吗?ACE(6.0.0)+Linux(SuSe 2.6.32.12-0.7)下才会出现这个问题,AIX下运行没这个问题。要么就是我ACE安装有问题?
发表于 2011-3-12 20:01:42 | 显示全部楼层
不知道楼主指的具体是什么问题?建议把实际的使用环境描述出来。
看上面的程序,觉得semaphore的语义建议去确认一下
ACE_Thread_Semaphore que(0);这条语句把semaphore的资源初始化为0在此例子使用岂不是要造成死等待?
别外编译时请加上头文件<ace/OS_NS_string.h>
 楼主| 发表于 2011-3-15 00:09:28 | 显示全部楼层
谢谢楼上。其实很简单,定义ACE_Thread_Semaphore que(0)是为了在实际代码中是等待另一个线程release(), 然后才acquire。以上代码是我从实际code里narrow出来的一个小测试例子,其实环境就是ACE6.0.0+Linux(SuSe 2.6.32.12-0.7), gcc 是4.3.4,如果谁有类似环境,麻烦帮我测一下,确认一下到底是ACE Linux下的bug,还是其他环境问题。不胜感谢!
发表于 2011-3-16 14:13:26 | 显示全部楼层
估计是使用的问题,像这种情况不太可能出问题;
 楼主| 发表于 2011-3-17 00:21:22 | 显示全部楼层
谢谢楼上回答,“使用问题”是什么意思?AIX上也这么用的,但是好的。我唯一担心的可能是安装时什么地方的问题,所以哪位有环境的能帮我测一下?否则只能提交bug form了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 00:58 , Processed in 0.013709 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表