多线称 需要重入的问题

benjiam 2007-02-04 11:14:43
原来写多线的时候,因为水平原因。 一般在共享资源的时候 采用互斥来控制。

现在我想到了一个问题。 函数重入的问题。

假设 class a 有 A B
两个对象

在A B 的c( int ) 方法中
采用了
class a::c(int m)
{
int a = m+100;
...
...
...

}

如果2个线称同时进入这个函数 就会出现重入的问题

A.c(100);
B.c(200);

两者的数据是否会被相互污染。我不太确定。 如果是的话
那就需要 int *a = new int;
*a = m+100

到最后再delete 掉?

...全文
236 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjlsmail 2008-07-14
  • 打赏
  • 举报
回复
假设   class   a         有   A   B 
两个对象

在A B 的c( int ) 方法中
采用了
class a::c(int m)
{
int a = m+100;
...
...
...

}

如果2个线称同时进入这个函数 就会出现重入的问题

A.c(100);
B.c(200);


因为两个线程操作的不是同一个对象,类中没有静态变量,所以是可以重入的。
sdlyczl 2007-02-05
  • 打赏
  • 举报
回复
可不可以这样说,对于单线程,不会出现函数可重入的问题。对于多线程,当函数访问全局变量或者静态变量时,可能会出现可重入的问题?
sdlyczl 2007-02-05
  • 打赏
  • 举报
回复
doubhor() ( ) 信誉:100 Blog

说的太好了,强烈lz给doubhor() ( ) 信誉:100 Blog 分

呵呵
doubhor 2007-02-05
  • 打赏
  • 举报
回复
这里你举的这个例子中a好像有重复,不太明白你的意思。

说一下我的思路吧。

对象在任何时候只会有一个,不同的是这个对象的生命周期和空间可访问性。如果一个对象是在函数中定义的,无论这个函数是普通函数还是线程函数,那么不同函数中的变量都不同。
如果变量定义在函数外面,则变量只有一份。这时候如果不同的线程访问这个变量就会出现互斥问题。

至于函数,函数的代码只有一份,只是在任何时候进入函数时,会在当前栈上面保存一些信息,包括返回地址,形参等,当进入被调用的函数后,该函数中声明的变量会继续在栈上面建立。
从这一点考虑,来分析两种情况:
1。单线程程序:单线程程序中所有代码都是一条线执行下去的,任何时候都只能执行一个地方的代码,所有的栈都是同一个,栈上面的东西线性排列,即时一个函数被调用了多次,他们在栈上面的位置也不同,所以不会出现重入问题。
2。多线程程序:多线程程序可能会出现代码交替执行的问题,如果一个变量是在线程函数外面定义的,则可能会互斥问题。对于在线程函数内部定义的变量,或者在线程函数内部又调用的函数中定义的变量,由于线程自己拥有自己的栈,这样不同的变量在不同的栈上面,也不会出现互斥问题。

关键思路:
每一个线程拥有自己的栈
栈上面保存了函数的返回地址,形参,临时变量
函数代码只有一份,不同函数不同的是就是返回地址,形参,临时变量,这些不同的信息都保存在栈上面了

benjiam 2007-02-05
  • 打赏
  • 举报
回复
每个 对象都有 自己的空间 栈或者堆。

但是 对象方法只有一份。
睡在床板下_ 2007-02-05
  • 打赏
  • 举报
回复
每个 对象都有 自己的栈空间
fflush 2007-02-04
  • 打赏
  • 举报
回复
不然那些lib不会把原来的函数重写 给出重入的版本。
------------------------------------

一些函数需要提供可重入的版本,是因为这些函数使用了一些全局或者静态变量来保存上次运行的状态,这种方法在单线程下可以工作,但在多线程下会有同步问题,典型的例子是c runtime lib中的strtok, signal等的实现

函数只有一个copy,位于进程的地址空间中,但是每个线程都有自己的调用栈,换句话说,代码只有一份,但是局部变量每个thread有自己的一份。如果thread之间不共享资源,他们就不会有同步问题
benjiam 2007-02-04
  • 打赏
  • 举报
回复
你指系统会有函数的一个copy 还是存在2个copy?

1个肯定有重入的问题的。

A.c 和B.c 都会去调用同一个地址的一个函数。 那么同时进去 肯定有重入的问题的。

不然那些lib不会把原来的函数重写 给出重入的版本。
fflush 2007-02-04
  • 打赏
  • 举报
回复
thread1:
...
A.c(100);
...

thread2:
...
B.c(200);
...


lz是这个意思吧,这里不会有同步问题,A.c和B.c位于不同的栈空间,有不同的上下文环境
benjiam 2007-02-04
  • 打赏
  • 举报
回复
受教了。 但是静态函数 是否存在重入的问题?

按照 某些书的说法 静态函数 只保留一份? 不是太明白。 按照你的说法 所有的函数都是静态的。

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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