我想防止函数重入,应怎么办?

dylwx 2003-06-02 10:00:40
CCriticalSection是不行的,因为是同一线程,它不起作用
...全文
319 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2003-06-07
  • 打赏
  • 举报
回复
哦,总算明白了。
递归不可能加锁呀,否则就递归不下去了呀。

肯定是你的递归设计又问题,要么就是不适合使用递归。
ahao 2003-06-07
  • 打赏
  • 举报
回复
你在消息处理函数里调用SendMessage发送同一消息,是可能重入
孤必有邻 2003-06-07
  • 打赏
  • 举报
回复
解决问题的方向不对!
dylwx 2003-06-06
  • 打赏
  • 举报
回复
就是递归调用。
虽然我的程序没有直接设计递归调用,但是我放置测试语句时发现的确存在重入问题。
我猜想Windows的消息机制有可能在同一线程中造成递归调用
Zark 2003-06-06
  • 打赏
  • 举报
回复
的确让人迷糊,既然是同一个线程,又怎么会同时调用同一个函数?倒底是谁和谁同时调用这一个"可怜"的函数?
ahao 2003-06-05
  • 打赏
  • 举报
回复
奇怪的问题
dylwx 2003-06-05
  • 打赏
  • 举报
回复
!!!
dylwx 2003-06-05
  • 打赏
  • 举报
回复
当然不算,只要没有执行到关键代码就不算重入。
用局部变量,肯定先判断,如果符合执行条件,马上修改变量值,使得别的调用不能进入,万一两次调用同时到达判断语句,那不是就重入了吗?
信号灯等机制可以,互斥体不行(同一线程的原因),我提问时的问题是别的原因引起的,该问已经解决。
thundered 2003-06-03
  • 打赏
  • 举报
回复
如果是在同一个线程内,最简单的就是定义一个bool型的静态变量,在函数的头部检查bool变量,如果为true,说明已经被调用了,否则说明没有被调用,进入把bool型变量设成true.
由于在一个线程中前后多次调用一个函数只有一种可能---是递归调用。所以可以将递归调用替换成循环,便于控制。

上面用静态变量的方法只能适用于如果已有调用,后续调用被扔掉也没有关系的逻辑,如果希望后续的调用能够排队,并且继续得到依序调用,可能可以像消息队列一样建立一张包含函数参数结构的链表,然后设置一个event对象,来手工设置,(这种方法不知在单线程中可行否?),如果不考虑效率,在同一个线程中肯定可以用不断的查询当前静态变量的方法来完成函数的排队调用。
windleee 2003-06-03
  • 打赏
  • 举报
回复
进入函数后再判断,这样也算重入了吧?!
jjqiao710102 2003-06-03
  • 打赏
  • 举报
回复
创建互斥体或信号灯
晨星 2003-06-03
  • 打赏
  • 举报
回复
同一线程怎么会有“重入”问题,你是指执行两次以上?那就别让它执行两次以上呀。
shuicai 2003-06-03
  • 打赏
  • 举报
回复
关注
wjl_2001 2003-06-03
  • 打赏
  • 举报
回复
创建互斥体或信号灯
joachern 2003-06-03
  • 打赏
  • 举报
回复
up
diyzhao 2003-06-03
  • 打赏
  • 举报
回复
局部变量是静态局部变量
diyzhao 2003-06-03
  • 打赏
  • 举报
回复
可以用一个局部变量来判断是否已执行过,如是,则跳出即可
NowCan 2003-06-03
  • 打赏
  • 举报
回复
判断条件的时候不是已经重入了吗,那有什么用?
Kevin_qing 2003-06-03
  • 打赏
  • 举报
回复
用个静态局部变量不就解决了嘛···
如果要多线程再加个锁
windbells 2003-06-02
  • 打赏
  • 举报
回复
创建互斥体或信号灯
加载更多回复(3)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧