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

    同样,两个线程中的函数的局部变量由于是保存在不同的线程中,因此不需要进行互斥处理
     
    结论:
    因此需要互斥处理的,一般是函数中有全局变量,有动态申请的空间,有静态局部变量,有需要进程数据循环发送之类的操作需要进行互斥处理
  • 相关阅读:
    ABB机器人的安全板短接详情
    基恩士HMI的跳转
    ABB 轴配置的使用(为什么需要关闭)
    ABB选项讲解
    法那科夹具夹取和放置的操作
    roboguide的夹具制作
    法那科机器人的基本介绍(创建文件)
    关于三菱触摸屏GT Designer3 仿真软件创建工程
    动态循环插入<option>,鼠标点击从数据库调取data
    ajax将众多行数组转json传入html页面循环传入table中
  • 原文地址:https://www.cnblogs.com/zsq1993/p/5947080.html
Copyright © 2011-2022 走看看