线程安全和可重入
线程安全和可重入
线程安全
定义
如果一个函数被多个线程并发执行时,这个函数不会出现异常,则称这个函数是线程安全的。
线程安全的破坏
- 如果这个函数被多个线程调用时,可能会修改同一个资源,则就可能破坏线程安全。
例如,函数访问全局变量:
#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;
}
可重入
定义
如果多个执行流反复执行一个函数,其结果不会发生改变,则称这个函数是可重入的。
线程安全和可重入的区别和联系
区别
线程安全的函数是在多线程的场景下,因此可以用多线程环境提供的同步手段进行同步。可重入函数面向的是任何执行流(多线程环境是一种多个执行流场景,其它场景还包括信号、中断的处理);
线程安全函数处理的是多线程场景(并发),可重入函数需要面对单线程场景;
联系
可重入函数是线程安全函数的真子集;
一个典型的例子是,如果给一个函数加上同步锁,则这个函数可以称为线程安全函数。但是这个同步锁如果已锁,此时触发了信号处理,并且在信号处理中调用了这个函数,则就会出现死锁。
posted on 2023-07-10 12:13 amazzzzzing 阅读(26) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧