amazzzzzing

导航

统计

线程安全和可重入

线程安全和可重入

线程安全

定义

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

线程安全的破坏

  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;
}

可重入

定义

如果多个执行流反复执行一个函数,其结果不会发生改变,则称这个函数是可重入的。

线程安全和可重入的区别和联系

区别

线程安全的函数是在多线程的场景下,因此可以用多线程环境提供的同步手段进行同步。可重入函数面向的是任何执行流(多线程环境是一种多个执行流场景,其它场景还包括信号、中断的处理);

线程安全函数处理的是多线程场景(并发),可重入函数需要面对单线程场景;

联系

可重入函数是线程安全函数的真子集;

一个典型的例子是,如果给一个函数加上同步锁,则这个函数可以称为线程安全函数。但是这个同步锁如果已锁,此时触发了信号处理,并且在信号处理中调用了这个函数,则就会出现死锁。

posted on   amazzzzzing  阅读(26)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示