laoshuhunya 发表于 2019-2-19 23:47:36

重入与线程安全解惑

软件开发工具链一般不会对子程序/函数不可重入或者非线程安全给出错误和警告信息,只有在软件运行中才会出现异常。在具有中断(抢占)系统或并行(并发)处理能力的处理器中,子程序或函数的重入与线程安全性显得格外重要,这是确保多线程系统正确可靠运行的重要基础。

先看两个简单但极具代表性的例子。
StaticVariable32 和 StaticVariable64 是多线程共享的全局静态变量。
在下面这个例子中,函数Function32是可重入的。
volatile int32_tStaticVariable32 = 100;

int Function32(int32_t Variable)
{   
    return (Variable > StaticVariable32) ?(1):(0);
}

在下面这个例子中,函数Function64是不可重入的。
这是因为它不符合本贴附图中规则R6.2“对任何外部静态变量的访问均为原子操作”的要求。
volatile int64_tStaticVariable64 = 100;

int Function64(int64_t Variable)
{   
    return (Variable > StaticVariable64) ?(1):(0);
}

重入与线程安全性涉及目标处理器的基本架构、指令系统、寻址方式、操作系统以及工具链等相关知识。本文内容仅针对C语言、ARM Cortex-M处理器和KEIL MDK-ARM工具链,旨在明确重入与线程安全的相关概念,以及在应用中如何确保子程序或函数可重入和线程安全的一般规则。


laoshuhunya 发表于 2019-2-20 00:06:37


ronic 发表于 2019-2-20 08:06:45

支持一下

gagmeng 发表于 2019-2-20 08:26:18

多谢分享,学习了下

security 发表于 2019-2-20 08:33:12

支持一下,
多谢分享。

zhang0352505 发表于 2019-2-20 08:39:07

除了字体颜色和排版有点辣眼睛,其他都挺好的,多谢楼主

sinc_mark 发表于 2019-2-20 08:52:10

感谢无私奉献!

greenflyqqq 发表于 2019-2-20 08:56:25

多谢楼主分享!谢谢!

TKZXJ 发表于 2019-2-20 09:09:21

多谢分享。

Ray______ 发表于 2019-2-20 09:18:47

用指针操作访问静态变量会不一样?

laoshuhunya 发表于 2019-2-20 09:46:47

Ray______ 发表于 2019-2-20 09:18
用指针操作访问静态变量会不一样?

这问题问得好。
对ARM Cortex-M 处理器来说,以变量名和指针访问静态变量,它们的共同点如下:


它们的不同点是:以变量名访问,在不同线程中你只能访问同一个对象,而通过指针则可以在不同线程中访问不同对象,这就回避了竞争访问。这也是指针的主要用途之一。

wx-ta 发表于 2019-2-20 10:07:22

laoshuhunya 发表于 2019-2-20 09:46
这问题问得好。
对ARM Cortex-M 处理器来说,以变量名和指针访问静态变量,它们的共同点如下:



指针操作,不同线程中指向同一个地址的指针也是访问的同一个静态变量

laoshuhunya 发表于 2019-2-20 10:11:21

wx-ta 发表于 2019-2-20 10:07
指针操作,不同线程中指向同一个地址的指针也是访问的同一个静态变量

所以说它不能确保可重入,只能保证线程安全(在各个线程中指针指向不同目标的条件下)

bigwei 发表于 2019-2-20 12:21:32

学习下,多谢卤煮

lsn_tj 发表于 2019-2-20 13:01:01

没看出来Function64和Function32这两个函数有什么区别啊?

lsn_tj 发表于 2019-2-20 13:01:38

图片太小,手机上看不清图片

heimareed 发表于 2019-2-20 13:21:42

好贴,多谢分享~

security 发表于 2019-2-20 13:49:39

红色和洋红色,在这个背景下,对我来说,都是辣眼睛的。看着累。

flamma 发表于 2019-2-20 13:58:20

lsn_tj 发表于 2019-2-20 13:01
没看出来Function64和Function32这两个函数有什么区别啊?

一个是32位一个是64位。32位数据的比较是一条指令就完成了,是原子操作。而64位比较的是多条指令,可以被打断。

myxiaonia 发表于 2019-2-20 14:20:23

lz最近对底层很深入哦,一起学习

laoshuhunya 发表于 2019-2-20 14:35:28

security 发表于 2019-2-20 13:49
红色和洋红色,在这个背景下,对我来说,都是辣眼睛的。看着累。

收到。
黑色背景下,可选的字体颜色不多,后面我们会尝试其他方案。为此我给几位眼界颇高的美女看了,她们觉得挺好的{:titter:}

laoshuhunya 发表于 2019-2-20 14:45:37

myxiaonia 发表于 2019-2-20 14:20
lz最近对底层很深入哦,一起学习

这是C编程中最阴暗隐晦的角落,虽然危机四伏,但也是渡劫成功的必经关口 {:titter:}

myxiaonia 发表于 2019-2-20 15:46:28

laoshuhunya 发表于 2019-2-20 14:45
这是C编程中最阴暗隐晦的角落,虽然危机四伏,但也是渡劫成功的必经关口   ...

我在图片上看到了你之前回复我的内容,要写这类文章必须要下功夫,没法乱吹牛的

laoshuhunya 发表于 2019-2-20 15:54:21

myxiaonia 发表于 2019-2-20 15:46
我在图片上看到了你之前回复我的内容,要写这类文章必须要下功夫,没法乱吹牛的 ...

代码重入问题牵扯的面比较大,春节刚好有空把思路整理总结下

rifjft 发表于 2019-2-20 16:14:10

laoshuhunya 发表于 2019-2-20 14:35
收到。
黑色背景下,可选的字体颜色不多,后面我们会尝试其他方案。为此我给几位眼界颇高的美女看了,她 ...

{:lol:}几位 眼界颇高的美女……

偶觉得是不是应该分享美女图{:shy:}

qq78929709 发表于 2019-2-20 16:36:03

flamma 发表于 2019-2-20 13:58
一个是32位一个是64位。32位数据的比较是一条指令就完成了,是原子操作。而64位比较的是多条指令,可以被 ...

打断对线程的运行本身有什么影响呢?因为都是对静态变量的读取,就算被打断了也不会影响读出来的值吧

xf331785508 发表于 2019-2-20 16:49:33

这种背景花里胡哨的东东,看的真累。

luohui5003 发表于 2019-2-20 17:23:32


多谢楼主分享!谢谢!

lsn_tj 发表于 2019-2-20 19:08:35

flamma 发表于 2019-2-20 13:58
一个是32位一个是64位。32位数据的比较是一条指令就完成了,是原子操作。而64位比较的是多条指令,可以被 ...

多谢指教。再请教一下,这个问题也要看CPU是多少位的吧?

flamma 发表于 2019-2-21 09:51:54

qq78929709 发表于 2019-2-20 16:36
打断对线程的运行本身有什么影响呢?因为都是对静态变量的读取,就算被打断了也不会影响读出来的值吧 ...

这不是在讨论线程安全吗,比如只比较了一半,被高优先级的线程打断,把这个值改掉了。程序的返回值可能和设计时的考虑不一样了。

flamma 发表于 2019-2-21 09:55:08

lsn_tj 发表于 2019-2-20 19:08
多谢指教。再请教一下,这个问题也要看CPU是多少位的吧?

是的。这里讨论的是ARM Cortex-M。什么是原子操作和CPU的位数和指令架构都有关系。

icoyool 发表于 2019-2-21 14:56:30

laoshuhunya 发表于 2019-2-20 09:46
这问题问得好。
对ARM Cortex-M 处理器来说,以变量名和指针访问静态变量,它们的共同点如下:



变量名和指针并没有本质区别,变量名不让用是因为编译器认为变量名称的作用域不够吧。

laoshuhunya 发表于 2019-2-21 20:14:20

icoyool 发表于 2019-2-21 14:56
变量名和指针并没有本质区别,变量名不让用是因为编译器认为变量名称的作用域不够吧。 ...

要在某个班级里面找到某位学生可以叫她名字,也可以喊她的座号。名字和座号都对应某个人,但名字和座号显然是不同的。在一个班级里面,座号具有唯一性,名字则可能有重名。而在一所学校里,座号将不再唯一,不同的班级有同样的座号。所以,座号的唯一性只在班级里有效,或者说,它的作用域是班级。在计算机系统中,变量名和指针的关系大体与此类似。

可以看下《指针解惑》,虽然排版不是太好看,但里面的每一句话都不是多余的,有关指针的问题几乎都能在那里找到答案。

tdchenke 发表于 2019-2-22 16:11:58

感谢分享学习了

lmf159 发表于 2019-2-22 16:50:37

多谢分享。

su33691 发表于 2019-2-22 17:17:01

楼主玩的太高深了。目前只是关注临界变量的原子操作问题。

XIUQIN 发表于 2019-2-22 17:41:17

谢谢分享!

huangqi412 发表于 2019-3-12 15:39:34

laoshuhunya 发表于 2019-2-20 14:35
收到。
黑色背景下,可选的字体颜色不多,后面我们会尝试其他方案。为此我给几位眼界颇高的美女看了,她 ...

虚拟世界实验室   楼主有网站链接?

laoshuhunya 发表于 2019-3-12 21:56:28

huangqi412 发表于 2019-3-12 15:39
虚拟世界实验室   楼主有网站链接?

世界是虚拟的,实验室也是虚拟的~~~
页: [1]
查看完整版本: 重入与线程安全解惑