Reentrant和ThreadSafe函数示例

时间:2014-01-26 22:21:34

标签: c linux

请给我一些小代码片段,以了解可重入和线程安全的函数,以及既不是它们也不仅仅是其中一个的片段。

1 个答案:

答案 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是安全的,因为它仅依赖于传入的值,并且不会以任何方式修改它们。

注意:这些都不是确定线程安全所必需或足够的,但它们为您提供了良好的基准来确定代码是否是线程安全的。