2009-09-16 38 views
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

我相信平等守卫'if(i == j)'是不必要的。你已经要求'i'严格小于'j'。 – dmckee 2009-09-16 21:50:58

+0

很好找。它被删除 – Quincy 2009-09-16 22:51:02

+1

仅供参考,您可以使用std :: reverse(foo,foo + strlen(foo))实现相同的效果,其中“foo”是可变的字符串。 AFAIK中,大多数std :: reverse()实现在使用这种基本迭代器(即本例中的指针)时是线程安全的并且是可重入的。 strlen()评论其他已发布,当然仍然适用。 – Void 2009-09-16 23:33:55

回答

14

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

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

编辑:关于双重检查,ISO C标准似乎没有强制strlen的线程安全。因此,您可能使用带有非线程安全的strlen的C标准库的可能性很小,因此可以从中继承非重入。

11

是的,你说得对,这是折返。它只影响它的参数和它的局部变量。

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

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

4

是的,这是重入,因为它只能修改其参数

Wikipedia提供什么都被设置成折返一些漂亮点:

要折返,计算机程序或程序:

  • 必须不包含静态(或全局)非常量数据。
  • 不得将地址返回到静态(或全局)非常数数据。 只能在由调用者提供给它的数据上工作。
  • 不能依靠锁定单身资源。
  • 不得修改自己的代码。 1(除非在其自己的唯一线程存储中执行)
  • 不得调用不可重入计算机程序或例程。
2

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

+1

他编辑了代码示例,因此'strlen'不需要在这里折返。 – mbx 2011-08-30 13:10:14

相关问题