请给我一些小代码片段,以了解可重入和线程安全的函数,以及既不是它们也不仅仅是其中一个的片段。
答案 0 :(得分:2)
我将尝试解释主要的差异,然后展示代码来演示这些概念。
首先,这个名字用词不当。代码始终是线程安全且可重入安全的。代码不关心有多少线程正在执行它,因为代码是不可变的。相反,它是由函数操纵的数据,可能是也可能不是线程安全的。它在面向对象的代码中比在C中更容易演示,但这个概念也转换为C语言。
以下是使用Java的简单示例:
Class MyClass
{
private int _counter;
public MyClass()
{
_counter = 0;
}
public int unsafeMethod()
{
_counter = _counter + 1;
return _counter;
}
public int safeMethod(int a, int b)
{
return a + b;
}
}
在前面的示例中,unsafeMethod
不安全,因为它会修改变量。如果线程同时执行该方法,则结果将不确定。 safeMethod
是安全的,因为它仅依赖于传入的值,并且不会以任何方式修改它们。
注意:这些都不是确定线程安全所必需或足够的,但它们为您提供了良好的基准来确定代码是否是线程安全的。