这个函数是可重入的吗?

时间:2009-09-16 21:21:43

标签: c++ reentrancy

void reverse_string(char* string, int str_size) {
    char tmp;
    int i = 0;
    int j = str_size - 1;
    while (i < j) {
        tmp = string[i];
        string[i] = string[j];
        string[j] = tmp;
        ++i;
        --j;
    }
}

我认为这个函数是可重入的,因为它不使用任何全局变量。它只修改参数。

我的问题是: 这个函数是可重入的吗? 如果是的话,我的论证是否足够好?

提前致谢

4 个答案:

答案 0 :(得分:14)

是的,这是一个可重入的功能。可重入函数被定义为在它们自己执行时可以被调用的函数(由于递归或并发)。在这种情况下,递归是没有意义的,并且您同时是安全的(假设参数不同)。

你的论点很好 - 没有显式或隐式访问全局或共享状态,因此确保了重入。这是您的显式代码和C的语义的组合。其他语言和API 可能没有此属性。

编辑:在仔细检查时,ISO C标准似乎不会强制strlen的线程安全。因此,您很可能使用带有非线程安全strlen的C标准库,因此继承了它的非重入性。

答案 1 :(得分:11)

是的,你是对的,它是可以重入的。它只影响其参数及其局部变量。

不同实例可能会干扰的唯一方法是将指针传递给同一个缓冲区。

有一个很好的definition of reentrant on Wikipedia,你的功能明显符合所有条款。

答案 2 :(得分:4)

是的,它是可重入的,因为它只修改了它的参数

Wikipedia提供了一些关于必须提供的可重入内容的好点:

可重入,计算机程序或例程:

  • 必须不保留静态(或全局)非常量数据。
  • 不得将地址返回静态(或全局)非常量数据。 必须仅对调用者提供给它的数据有效。
  • 不得依赖锁定单例资源。
  • 不得修改自己的代码。1(除非在自己独特的线程存储中执行)
  • 不得调用不可重入的计算机程序或例程。

答案 3 :(得分:2)

您需要假设(或验证)strlen是可重入的(可能是)。