请教各位高手,什么叫“代码重入”

vcbear 2000-12-09 01:00:00
看操作系统里的书,经常说到什么“代码重入”,这个概念我不是很清楚。
请教各位高手,什么叫“代码重入”,会造成什么后果。
...全文
440 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
singlerace 2000-12-10
可重入和不可重入不是绝对的,取决于代码的具体实现。
所以,说WindowProc是可重入或不可重入都是不对的,因为这取决于WindowProc本身的实现代码。另外可重入并不意味着不能用静态或全局变量,只是应该避免。
下面的代码是strtok的VC++版本。
ANSI C的标准版本用一个静态变量nextoken来纪录上一次的查找结果,这在单线程中没有什么问题;
但是静态变量是进程内共享的,如果两个线程同时调用strtok,nextoken会出现混乱。因此在VC实现的
多线程版本中用一个线程局部存储ptd->_token来代替nextoken。
C运行时库的其他函数也有类似的问题。这是VC++中C运行时库分单线程版本和多线程版本的原因。
char * __cdecl strtok (char * string,const char * control)
{
unsigned char *str;
const unsigned char *ctrl = control;
unsigned char map[32];
int count;
#ifdef _MT
_ptiddata ptd = _getptd();
#else /* _MT */
static char *nextoken;
#endif /* _MT */
for (count = 0; count < 32; count++)
map[count] = 0;
do {
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);
if (string)
str = string;
else
#ifdef _MT
str = ptd->_token;
#else /* _MT */
str = nextoken;
#endif /* _MT */
while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
str++;
string = str;
for ( ; *str ; str++ )
if ( map[*str >> 3] & (1 << (*str & 7)) ) {
*str++ = '\0';
break;
}
#ifdef _MT
ptd->_token = str;
#else /* _MT */
nextoken = str;
#endif /* _MT */
if ( string == str ) return NULL;
else return string;
}
  • 打赏
  • 举报
回复
andygood 2000-12-10

举个例子:在MFC中有如下代码:

void CFrameWnd::RecalcLayout(BOOL bNotify)
{
if (m_bInRecalcLayout)
return;

m_bInRecalcLayout = TRUE;
......

在这里,RecalcLayout在一次未完成的时候不应该被重复调用,也就是不允许“重入”。函数是使用一个BOOL变量m_bInRecalcLayout来判断的。

允不允许重入主要看具体的需要。

  • 打赏
  • 举报
回复
NowCan 2000-12-10
我也来听课
  • 打赏
  • 举报
回复
helphelphelp 2000-12-10
Windows的窗口过程函数WndProc()就是一个可重入函数,为什么它可以有静态变量?
  • 打赏
  • 举报
回复
singlerace 2000-12-10
代码可重入是指对同一个函数的两次调用不存在任何依赖关系。一般说来,一个可重入的函数不应包含静态变量。
例如C运行时函数strtok就是很典型的不可重入函数,因为它用了一个静态(或全局)变量保存上一次的查找结果。
  • 打赏
  • 举报
回复
ab 2000-12-09
同意 sxbyl 的说法。DLL的使用是主要为了减少内存的占用。代码重入是同步方面的问题。
  • 打赏
  • 举报
回复
vcmfc 2000-12-09
来听课!
  • 打赏
  • 举报
回复
happylaodu 2000-12-09
简单地理解呢,代码重入就是内存中同样的两段可执行代码。不会有什么后果,只是会浪费资源。在以前大量使用静态库的时代,代码重入的就是两个或多个程序都要用到同一个功能模块,它们都需要在内存有该模块的一个copy,而不能实现共享——多浪费。

递归不是"代码重入",递归程序一层层调用来调用去,用得都是自己的那段代码,只是它不得不为此设置一个大大的栈空间用于保存返回地址、中间结果,因此也浪费资源,但和代码重入不是一回事。

动态链接库的提出正是为了减少代码重入,这样多个程序可以在内存中只有一个功能模块的copy时,对它进行共享。因此如果程序都用动态链接库,可使用重入度达到最小。
  • 打赏
  • 举报
回复
Hidy 2000-12-09
递归是否属于“代码重入”呢?
  • 打赏
  • 举报
回复
sxbyl 2000-12-09
我的理解:比如有一个函数,在还没有结束的时候又被调用了一次,至于后果,那要看你代码是干什么的了。
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2000-12-09 01:00
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……