虚拟机软件是virtual box,虚拟机和物理机都是ubuntu 12.04
在main.cpp中
//创建一个定时器,每隔一段时间更新用户状态
signal(SIGALRM,refreshClientStatus);
//定时器
struct itimerval timeinter;
timeinter.it_value.tv_sec=5;//初始时间
timeinter.it_value.tv_usec=0;
timeinter.it_interval.tv_sec=5;//间隔时间
timeinter.it_interval.tv_usec=0;
//开启定时器
setitimer(ITIMER_REAL,&timeinter,NULL);
处理函数的代码如下
void refreshClientStatus(int)
{
FILE*fp = fopen("info.txt","w");
fprintf(fp,"refreshClientStatus trigger.\n");
fclose(fp);
pclientinfomap->Refresh();
}
//.....
void ClientInfoMap::Refresh(void)
{
map<string,ClientInfo>::iterator it;
pthread_mutex_lock(&lock);//加锁
for(it=pmap->begin(); it!=pmap->end(); ++it)
{
if(-- ((it->second).status) == OFFLINE)
{
DeleteWithoutMux(it->first);//删除
}
}
cout<<"ClientInfoMap::Refresh被调用.\n";
pthread_mutex_unlock(&lock);//释放锁
}
在虚拟机下一直看不到信号处理函数打印出的字符串。
在物理机中却正常的。打印如下
chao@chao-ThinkPad-Edge:~/IMProgram/server$ ./server
waiting for the client...
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
refreshClientStatus trigger.
ClientInfoMap::Refresh被调用.
ClientInfoMap::Refresh被调用.
^C
6 个解决方案
#1
你先得确认定时器是否被启动。你这段代码如果lock死锁了也会什么都不输出的。
#2
可是同样的代码 在物理机上能看到正常的结果啊。在物理机上没死锁,在虚拟机上也不会吧。
再说我是先打印字符串再去获得锁的
#3
要是死锁都这么容易重现的话就不会那么难调试了。
顺便你的第二句话。你自己看看你代码,是先输出还是先获得锁。
#4
哦你有一句fprintf。但是那个不够。你有可能fprintf到缓冲区还没写入内存,接下来死锁了。你文件里还是看不到的。
加句fflush(fp)以后看能不能看到那条fprintf。能看到的话说明死锁了。
加句fflush(fp)以后看能不能看到那条fprintf。能看到的话说明死锁了。
#5
>缓冲区还没写入内存
=>
缓冲区还没写入文件
=>
缓冲区还没写入文件
#6
可是我的fprintf后面紧跟着一句 fclose(fp);有刷新缓冲区的效果,和fflush(fp)一样吧!
还有
在物理机下一切正常,printf和fprintf都能正确输出,说明没有死锁啊。难道同一份代码在虚拟机下死锁在物理机下却不会死锁?
#1
你先得确认定时器是否被启动。你这段代码如果lock死锁了也会什么都不输出的。
#2
可是同样的代码 在物理机上能看到正常的结果啊。在物理机上没死锁,在虚拟机上也不会吧。
再说我是先打印字符串再去获得锁的
#3
要是死锁都这么容易重现的话就不会那么难调试了。
顺便你的第二句话。你自己看看你代码,是先输出还是先获得锁。
#4
哦你有一句fprintf。但是那个不够。你有可能fprintf到缓冲区还没写入内存,接下来死锁了。你文件里还是看不到的。
加句fflush(fp)以后看能不能看到那条fprintf。能看到的话说明死锁了。
加句fflush(fp)以后看能不能看到那条fprintf。能看到的话说明死锁了。
#5
>缓冲区还没写入内存
=>
缓冲区还没写入文件
=>
缓冲区还没写入文件
#6
可是我的fprintf后面紧跟着一句 fclose(fp);有刷新缓冲区的效果,和fflush(fp)一样吧!
还有
在物理机下一切正常,printf和fprintf都能正确输出,说明没有死锁啊。难道同一份代码在虚拟机下死锁在物理机下却不会死锁?