线程安全和可重入
线程安全
定义
如果一个函数被多个线程并发执行时,这个函数不会出现异常,则称这个函数是线程安全的。
线程安全的破坏
- 如果这个函数被多个线程调用时,可能会修改同一个资源,则就可能破坏线程安全。
例如,函数访问全局变量:
#include <thread>
#include <stdio.h>
int count = 0;
int start = 0;
int fun()
{
int suc_count = 0;
while(start == 0) {};
for (unsigned int i = 0; i < 10 * 1000 * 1000; ++i)
{
int old_value = count;
++count;
if (count - old_value == 1)
{
suc_count += 1;
}
}
printf("count=%d\n", suc_count);
return 0;
}
int main()
{
auto lamba_fun = [](){
return fun();
};
std::thread trd1(lamba_fun);
std::thread trd2(lamba_fun);
start = 1;
trd1.join();
trd2.join();
return 0;
}
可重入
定义
如果多个执行流反复执行一个函数,其结果不会发生改变,则称这个函数是可重入的。
线程安全和可重入的区别和联系
区别
线程安全的函数是在多线程的场景下,因此可以用多线程环境提供的同步手段进行同步。可重入函数面向的是任何执行流(多线程环境是一种多个执行流场景,其它场景还包括信号、中断的处理);
线程安全函数处理的是多线程场景(并发),可重入函数需要面对单线程场景;
联系
可重入函数是线程安全函数的真子集;
一个典型的例子是,如果给一个函数加上同步锁,则这个函数可以称为线程安全函数。但是这个同步锁如果已锁,此时触发了信号处理,并且在信号处理中调用了这个函数,则就会出现死锁。
标签:重入,count,函数,int,安全,线程 From: https://www.cnblogs.com/amazzzzzing/p/17540745.html