1
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

4 回答 4

15

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

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

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

于 2009-09-16T21:26:30.637 回答
11

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

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

维基百科上有一个很好的可重入定义,你的函数显然符合所有条款。

于 2009-09-16T21:25:13.150 回答
4

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

Wikipedia提供了一些关于必须提供哪些内容才能重入的要点:

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

  • 必须不保存静态(或全局)非常量数据。
  • 不得将地址返回给静态(或全局)非常量数据。必须仅对调用者提供给它的数据起作用。
  • 不能依赖锁来锁定单例资源。
  • 不得修改自己的代码。1(除非在自己独特的线程存储中执行)
  • 不得调用不可重入的计算机程序或例程。
于 2009-09-16T21:28:01.863 回答
2

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

于 2009-09-16T21:33:16.580 回答