关闭

两个线程同时调用一个函数会出现什么情况?

8841人阅读 评论(0) 收藏 举报
分类:

两个线程同时调用一个函数会出现什么情况?

最近在研究多线程,然后突然想到如果两个线程同时访问一个函数的话,要不要加锁呢,加锁怎么加,不加又怎样这样的问题..然后去网上找了些帖子学习学习......

上面的代码明显执行串了!!!!

函数本身只是代码,代码是只读的,无论多少个线程同时调用都无所谓,因为是只读嘛.但是函数里面总要用到暑假 ,如果数据属性线程级别(比如函数形参-->局部变量-->存在栈上-->每个线程都有自己的栈),那么同时调用是没关系的,因为用的都是本线程的数据;但是如果函数用到一些全局数据,比如全局变量,根据堆内存首地址去访问的堆内存(形参传入的),同时操作一个数据结构(如对一个链表有什么操作),静态局部变量,那就不行了,必须要加锁!!

 

http://blog.csdn.net/mq_ydn3102/article/details/8546722

1.线程中函数的调用

2.同一个进程中的两个线程调用同一个处理函数

3.两个不同的进程中的两个线程调用同一个处理函数

 

1.线程中函数的调用:

每个进程都会有自己的虚拟地址空间,同一个进程中的每一个线程都会在这个虚拟空间中,并被分配相应的资源. 

线程中的函数实体实在内存中,而函数中的局部变量则会一次被push到栈中.

如果是A函数调用B函数,则会先将A函数的参数和局部变量push到栈中,再将B函数的参数和局部变量push到栈中

具体如下(参数是从右往左压入栈中,__stdcall和__cdecl调用都是这么处理的):

void fun(param1, param2,. param3....paramN)
{
value1;
value2;
...
valueN;
}

如果执行上面的函数在栈中会这样变化

1:将fun函数的传入参数从右到左依次压入到栈中

2:将fun函数的指针压入栈中

3:将ebp,ebx等寄存器入栈保存
4:在栈中依次为各个变量分配空间

执行后的处理:

1.释放变量空间

2.弹出寄存器

3.ret,弹出eip,返回主调方代码

4.释放参数空间

2.两个线程调用同一个函数

 两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理(除非有非栈内存在捣乱,这种情况必须要有互斥锁)

3.两个不同进程中的两个线程调用同一个处理函数

同样,两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理
 
结论:
因此需要互斥处理的,一般是函数中有全局变量,有动态申请的空间,有静态局部变量,有需要进程数据循环发送(进程传参数给线程)之类的操作需要进行互斥处理

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java中,多个线程同时调用同一个静态方法的问题

我的原来程序是这样设计的,对于一些常用的方法,都用静态方法来实现,在多线程程序中直接调用,静态方法由于没有使用静态变量,所以没有进行线程同步。 类似以下程序: class ThreadI { public static void main(String[] arg) { Test...
  • truelove12358
  • truelove12358
  • 2014-07-26 09:46
  • 6508

多个线程调用同一个线程函数

多个线程调用同一个线程函数 悬赏分:50 - 解决时间:2007-12-11 13:59 如题,能这样吗?因为有很多个操作,但是这些操作都是一样的,所以想用相同的线程函数,但是感觉运行时线程还是一个一个运行,并没有提高速度,应该是我理解错了!!老大些帮帮忙,给个建议 问题...
  • herostarone
  • herostarone
  • 2012-03-08 20:15
  • 6625

linux多线程调用同一个函数解析

原文地址:http://blog.csdn.net/mq_ydn3102/article/details/8546722 问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么? 为了调查这个问题,我决定从以下三方...
  • renlonggg
  • renlonggg
  • 2017-11-03 13:53
  • 380

页面载入完成后执行多个函数。

页面载入完成以后会触发一个事件,这个事件是附加在窗口对象的onload事件。
  • zxjiayou1314
  • zxjiayou1314
  • 2015-05-24 19:01
  • 489

一个函数能否被两个线程同时调用

其实你可以这样想,函数本身只是代码,代码是只读的,无论多少个线程同时调都无所谓(因为只读嘛)。但是函数里面总要用到数据,如果数据属于线程(比如函数参数、局部变量,存在栈上,每个线程都有自己的栈),那么同时调还是没关系,因为用的本线程的数据;但是如果用了一些全局数据,比如全局变量,同时操作一个数据结构...
  • Beyond_cn
  • Beyond_cn
  • 2015-06-06 16:14
  • 3657

关于多个线程同时调用单例模式的对象,该对象中方法的局部变量是否会受多个线程的影响

关于多个线程同时调用单例模式的对象,该对象中方法的局部变量是否会受多个线程的影响 对于那些会以多线程运行的单例类,例如Web应用中的Servlet,每个方法中对局部变量的操作都是在线程自己独立的内存区域内完成的,所以是线程安全的。 对于成员变量的操作,可以使用ThreadLocal来保证线程安全...
  • zhujianli1314
  • zhujianli1314
  • 2017-03-15 14:35
  • 2128

两个进程调用同一函数, 这是怎么回事?

在某个大系统中, 从源代码看, 两个进程diao
  • stpeace
  • stpeace
  • 2014-09-18 22:11
  • 2277

多个线程调用同一个处理函数的互斥问题

问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么? 为了调查这个问题,我决定从以下三方面调查 1.线程中函数的调用 2.同一个进程中的两个线程调用同一个处理函数 3.两个不同进程中的两个线程调用同一个处理函数 1...
  • u012398613
  • u012398613
  • 2015-08-20 17:53
  • 2136

两个线程同时调用同一个处理函数的互斥问题

问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么? 为了调查这个问题,我决定从以下三方面调查 1.线程中函数的调用 2.同一个进程中的两个线程调用同一个处理函数 3.两个不同进程中的两个线程调用同一个处理函数...
  • mq_ydn3102
  • mq_ydn3102
  • 2013-01-30 21:35
  • 7195

多线程都调用一个函数,在这个函数中的一个局部变量什么情况会被修改

多线程
  • tony2278
  • tony2278
  • 2016-11-02 11:45
  • 1413
    个人资料
    • 访问:44673次
    • 积分:931
    • 等级:
    • 排名:千里之外
    • 原创:46篇
    • 转载:25篇
    • 译文:1篇
    • 评论:4条
    文章分类
    最新评论