zoukankan      html  css  js  c++  java
  • 多个线程调用同一个处理函数的互斥问题

    问题背景:在工作中遇到过一个问题,就是在两个线程同时调用同一个函数的时候,到底是应该在这个函数的内部什么处理上加上互斥。原因又是什么?

    为了调查这个问题,我决定从以下三方面调查

    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.两个不同进程中的两个线程调用同一个处理函数

    同样,两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理
     
    结论:
    因此需要互斥处理的,一般是函数中有全局变量,有动态申请的空间,有静态局部变量,有需要进程数据循环发送之类的操作需要进行互斥处理
  • 相关阅读:
    SpringBoot多数据库连接(mysql+oracle)
    SOAP与REST API的区别
    我与OAuth 2.0那点荒唐的小秘密
    我与Git的那些破事(下)--分支模型
    我与Git的那些破事(上)--代码管理
    Salesforce学习之路(十三)Aura案例实战分析
    Salesforce学习之路(十二)Aura组件表达式
    react 脚手架初次npm start时候运行报错
    兼容ie 提示用户升级浏览器 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    一行代码实现网站一键变灰功能
  • 原文地址:https://www.cnblogs.com/zsq1993/p/5947080.html
Copyright © 2011-2022 走看看