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 2023-07-10 12:13  amazzzzzing  阅读(33)  评论(0)    收藏  举报