C/C++中,函数的本质是一段可执行代码,代码包括了局部变量、全局变量的地址等等。到汇编语言的级别,变量函数等都可以视为汇编的代码片段。函数的本质就是一个可执行代码片段的集合

线程的详细介绍:http://www.cnblogs.com/tracylee/archive/2012/10/29/2744228.html
一个线程有自己的空间,有自己的局部变量。当一个线程执行一个函数的时候,会复制函数的代码段到自己的线程空间,之后执行该代码段。对于局部变量,每个线程会保存一个局部变量的副本,因为局部变量是保存在栈内存,所以一个线程更改局部变量不会影响其他线程的局部变量。全局变量是保存在堆内存上的,因此可以理解为线程是直接操作堆内存上的全局变量,因此如果一个线程改了全局变量,那么其他线程对应的全局变量肯定会更改,因为堆内存只有一个。

在多线程编程的过程中,所谓的添加互斥量、锁和条件变量等,本质上是为了保护堆内存上的东西,或者说是全局变量。所谓的竞争条件也是指的全局的,函数内部的局部的东西,不会引起竞争!!!!!

可以这么认为,对于C++11中的std:thread来说,函数是其执行的基本单位,这里说的函数包括普通函数、函数对象、std::funtion、仿函数、lambda表达式等。执行的时候,线程会复制函数的代码片段到自己的线程空间中去执行。线程空间的本身是封闭的,也就是说一个同级别的线程不能更改另一个线程的代码片段。。我们说的线程之间的通信,本质上说的是通过全局变量的状态,使得不同线程之间可以相互通信!!!

对于类的成员函数来说,线程复制函数的时候,类的成员变量相对于线程来说也是全局!!!!

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>static int N = 0;void fun(int n) {int t = 0;for (int i = 0; i < n; ++i) {++t;++N;}std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "local: " << t << std::endl;std::cout << "global: " << N << std::endl;
}class C {public:void fun(int n) {int t = 0;for (int i = 0; i < n; ++i) {++t;++_N;}std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "local: " << t << std::endl;std::cout << "global: " << _N << std::endl;}int _N;  // 这里的_N相对于fun函数是全局的!!!!!!!
};int main() {// 函数的例子std::cout << "function example:\n";std::thread t1(fun, 100000);std::thread t2(fun, 100000);t1.join();t2.join();std::this_thread::sleep_for(std::chrono::milliseconds(500));// 类的例子std::cout << "\nclass example:\n";C c;c._N = 0;std::thread t3(&C::fun, &c, 100000);std::thread t4(&C::fun, &c, 100000);t3.join();t4.join();return 0;
}

一种可能的执行结果:

function example:
local: 100000
global: 109248
local: 100000
global: 109248class example:
local: 100000
global: 115581
local: 100000
global: 115581

C/C++函数的本质以及多线程函数的调用过程相关推荐

  1. C++多线程之间,线程函数启动之后,多线程依赖的启动和线程唤醒操作。

    C++多线程之间,线程函数启动之后,线程间依赖的启动和唤醒操作 一.原理分析 1. 线程依赖关系 二. 实例分析 2.1 多线程启动 2.2 多线程模式讲解 (1) 多线程开启与主线程唤醒 (2)单线 ...

  2. Python基础教程:函数名本质

    函数名的本质 函数名实质上就是函数的内存地址 def wrapper():passprint(wrapper) 1.引用是什么? 当我们定义a=1的时候,系统会开辟一块内存空间来保存1,然后用a变量名 ...

  3. 还原virtual函数的本质-----C++

    当你每次看到C++类中声明一个virtual函数,特别是看到了一个virtual的虚构函数.你知道它的意思吗?你肯定会毫不犹豫的回答:不就是多态么...在运行时确定具体的行为么...完全正确,但这里我 ...

  4. 8月30日学习内容整理:命名空间,作用域,函数名本质,闭包

    补充: 三元运算:c= a if a>b else b  相当于:  if  a>b: c=a else: c=b 结构;  if条件成立的结果  if  条件  else  if条件不成 ...

  5. c语言函数名本质是指针,C语言的本质(12)——指针与函数

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...

  6. c语言createthread函数用法,C++多线程函数CreateThread如何使用?

    C++ CreateThread函数如何传递this指针作为参数 C++多线程函数CreateThread如何使用? #include #include using namespace std; /* ...

  7. vue 模板的本质是渲染函数

    上节内容我们学习了 Vue 组件的本质 ,这节内容看看 vue 模板的本质是什么. 模板 - 内容的承载体 Vue 在渲染组件的时候,需要使用者提供一个渲染模板或者渲染函数.渲染模板就是一个HTML字 ...

  8. python 函数修饰器 父类_Python函数嵌套、回调函数、闭包、装饰器和类

    markdown内容:Python函数嵌套.回调函数.闭包.装饰器和类 一级标题:主要描述内容 二级标题:各个内容 三级标题:重要概念 一.函数嵌套 1.1.作用域和嵌套函数 LEGB查找规则的 E, ...

  9. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

最新文章

  1. Control~Kalman filter
  2. python和R对dataframe的单列数据进行统计:value_counts、table、unique、nunique、min、max、mean、sort、length、var、quantile、
  3. MySQL 故障集锦
  4. 关于工大瑞普Dynamips模拟器
  5. 高德sdk定位当前位置_单次定位-获取位置-开发指南-iOS 定位SDK | 高德地图API
  6. 人民日报钟声:以和平合作守护世界安全
  7. mysql 安装 utf8mb4_mysql 安装和修改编码(utf8mb4)
  8. 【CSS 】动画animation
  9. 网易前端微专业,JavaScript程序设计基础篇:数组
  10. jQuery实现表格隔行换颜色:
  11. Python 编码规范(Google) (一)
  12. matplotlib绘制三维折线图
  13. 经商失败的人,最可怕的不是失去金钱,而是失去信心
  14. 控制器(下) -运维笔记
  15. 网页html代码大全
  16. 人脸识别数据集-WebFace260M
  17. JanusGraph的使用
  18. 通过PackageManager、PackageInfo、ApplicationInfo、ActivityInfo获得你想要的 App 信息
  19. python 多行注释后可运行程序报错
  20. 1月23日阴阳师服务器维护,阴阳师1月23日体验服更新 双神降临概率UP

热门文章

  1. axios请求跨域前端解决_Vue-创建axios实例并实现跨域请求(完整过程-前端)
  2. Super-palindrome 模拟+思维
  3. 《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)
  4. 图像处理——双线性插值(Bilinear Interpolation)
  5. Youki的装机日记~
  6. python 批量自动搜索、自动抓取需要的信息简单教程【selenium】
  7. 机器学习-多元梯度下降
  8. linux/ubuntu中制作deb安装包
  9. 深度学习之学习率退火的六种调整策略
  10. 语义分割之VOC2012、Cityscapes数据集介绍