首页 > 其他分享 >线程安全和可重入

线程安全和可重入

时间:2023-07-10 12:23:23浏览次数:34  
标签:重入 count 函数 int 安全 线程

线程安全和可重入

线程安全

定义

如果一个函数被多个线程并发执行时,这个函数不会出现异常,则称这个函数是线程安全的。

线程安全的破坏

  1. 如果这个函数被多个线程调用时,可能会修改同一个资源,则就可能破坏线程安全。

例如,函数访问全局变量:

#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

相关文章

  • Android 返回UI线程几种方法
    runOnUiThread()方法:在Activity或Fragment中,可以使用runOnUiThread()方法来在UI线程上运行代码。它接受一个Runnable对象,将其提交到UI线程的消息队列中执行。例如:runOnUiThread{//在UI线程上执行代码}Handler和post()方法:你可以使用Handler......
  • 线程池addWorker执行流程(添加工作线程)
    1//添加工作线程2privatebooleanaddWorker(RunnablefirstTask,booleancore){3//对线程池状态的判断以及对工作线程数量的判断4//外层for循环的标识5retry:6for(;;){7//获取ctl值8intc......
  • java 线程等待和唤醒方法
    java线程状态变迁图从图中可以看出Java线程等待方法是将线程从Runnable状态转换为Waiting状态,Java线程的唤醒方法是将线程从Waiting状态唤醒进入Runnable状态在Java中线程的等待和唤醒主要是分为3组:Object.wait()和Object.notify()LockSupport.park()和LockSupport.unp......
  • 03线程安全
    线程安全发生的终极原因是:内存,寄存器存在时间差。今天突然想到一个很好的例子 解释这个问题:一堂随堂测试,你正在答一道题,老师巡考看到你的答案是正确的,其他同学全部是错误的。晚上老师说道这次考试这道题只有一个同学做对了。但是老师不知道你在他走后,修改了答案。最终考试试卷......
  • Kubernetes安全框架
    Kubernetes安全框架K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过APIServer配置来启用插件。Authentication(鉴权):身份鉴别,只有正确的账号才能够通过认证Authorization(授权):判断用户是否有权限对访问的资源执行特定的动作AdmissionControl(准入......
  • 线程池excute方法执行流程
    1//线程池execute方法执行流程2publicvoidexecute(Runnablecommand){3//非空判断,判断提交的任务是否为空4if(command==null)5thrownewNullPointerException();6//获取ctl属性7intc=ctl.get......
  • 线程创建
    三种创建方式Threadclass继承Thread类Runnable接口实现Runnable接口Callable接口实现Callable接口Thread自定义线程类继承Thread类重写run()方法,编写线程执行体创建线程对象,调用start()方法启动线程//创建线程方式一:继承Thread类,重写run()......
  • SpringBoot 集成异步线程调用
    步骤:1、在自动审核的方法上加上@Async注解(标明要异步调用)2、在文章发布成功后调用审核的方法3、在自媒体引导类中使用@EnableAsync注解开启异步调用 ......
  • [Raspberry Pi]树莓派多线程下串口收发数据
    [RaspberryPi]树莓派多线程下串口收发数据鼠鼠用的是python开发树莓派,因为python是最优美的语言!少废话,直接上代码:importthreadingimportserialimportcv2ser=serial.Serial("/dev/ttyAMA0",115200)ser.timeout=5ifnotser.isOpen:ser.open()#打开串口......
  • Spring中的Controller和Service是线程安全的吗?我有点懵
    结论:不是线程安全的Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring的bean作用域(scope)类型singleton:单例,默认作用域。prototype:原型,每次创......