如果一个函数中使用static局部变量,怎样才能使函数具有可重入性.
RT 问题点数:20、回复次数:10Top
1 楼winstonch()回复于 2005-02-24 17:10:35 得分 4
把这个static变量放在这个函数内.Top
2 楼xuelong_zl(点雨点[我身上咋就没MM的香水味涅??#-_-])回复于 2005-02-24 17:44:46 得分 4
楼主好像,在描述的过程中已经把问题解决了,呵呵
现在只能同意楼上了Top
3 楼stevens2009(风)回复于 2005-02-24 18:10:45 得分 4
不可能Top
4 楼Great_Bug()回复于 2005-02-24 18:22:49 得分 4
既然用了static的局部变量,也就意味着不可重入,除非特殊的处理,或特殊的应用。Top
5 楼flyingcar(uClinux)回复于 2005-02-24 18:43:49 得分 0
回复人: Great_Bug(想当软件工程师的代码工人,失业中...) ( ) 信誉:100 2005-02-24 18:22:00 得分: 0
既然用了static的局部变量,也就意味着不可重入,除非特殊的处理,或特殊的应用。
======================================================================
怎么处理呢?
Top
6 楼ghwangtongji(ghwang)回复于 2005-02-24 18:44:32 得分 0
学习Top
7 楼Great_Bug()回复于 2005-02-24 18:53:40 得分 0
我的答案不够严谨。
但在某些时候,如果对该static变量的操作是不会被分割的操作,并且是只读或只写,则仍然可以重入。Top
8 楼little_paradise()回复于 2005-02-24 19:31:48 得分 0
应该说比较难,达淫帮顶Top
9 楼masterz(www.fruitfruit.com)回复于 2005-02-24 19:33:26 得分 4
这样如何:
//VC2003
#include ...
void safe_func()
{
static volatile long counter=0;
static long protected_data = 0;
struct AutoCount
{
AutoCount()
{
long tmp = InterlockedIncrement(&counter);
m_is_first = (1==tmp);
}
~AutoCount()
{
InterlockedDecrement(&counter);
}
bool is_first()
{
return m_is_first;
}
bool m_is_first;
} counter_obj;
if(counter_obj.is_first())
{
//it is safe to access the protected data
protected_data++;
std::cout<<"can work"<<std::endl;
}
else
{
std::cout<<"previous task has not finished,exit now"<<std::endl;
}
}
int main()
{
safe_func();
return 0;
}Top
10 楼coppermine(coppermine)回复于 2005-02-24 21:23:06 得分 0
具有可重入性的函数暗含无状态特征,即函数的输出只由当前函数的输入决定而不依赖其他状态.
函数内部有静态变量表明函数是有状态的,所以这样的函数是不可重入.
可重入和同步/互斥是不同的概念.Top




