• 5624阅读
  • 2回复

请高手指导,“重入”这个概念真绕人 [复制链接]

上一主题 下一主题
离线zooood
 
只看楼主 倒序阅读 楼主  发表于: 2010-11-09
— 本帖被 XChinux 执行加亮操作(2010-11-10) —
原文:
a class is said to be reentrant if its member functions can be called safely from multiple threads, as long as each thread uses a different instance of the class.
翻译:
不同线程使用不同实例名访问同一个类的同一个函数,这种行为如果是安全的,那这个类是可重入的。

咋一看,这句话似乎说了等于没说,既然实例名都不同了,也就是不同线程访问的对象都不一样,哪里还有不安全的地方?
细想,如果这个类有静态数据成员,那同类的不同对象都只有这个数据的一个拷贝,在这种情况下“对象不同”并不能保证静态数据的安全
按这样的理解,假如一个类操作了全局变量,那它也是不可重入的

我这样理解不知道对不对?还有没有其他情况呢?

另外都说次I线程里不能操作主线程的GUI类,是因为Widget和它的子类都是不可重入的
Widget到底在哪里不可重入?
离线wczt_123
只看该作者 1楼 发表于: 2010-11-17
简单点说,就是你的函数里面不能使用全局变量,或者依赖全局变量的函数,就可以重入
离线huzhiwen28

只看该作者 2楼 发表于: 2010-11-17
所谓重入,我理解的是对函数调用其处理是确定的,不能因为两个线程同时调用导致结果不一致。所以可重入函数中最好不能有写全局变量,不能有操作系统的全局资源,例如串口,如果真没有办法,必须有写全局变量的话,那么请加上互斥锁。

http://blog.sina.com.cn/tonyhuzhiwen
https://github.com/huzhiwen28/
专注于工业嵌入设备开发
快速回复
限100 字节
 
上一个 下一个