在保持递归的同时使这个函数线程安全

时间:2013-02-28 20:03:13

标签: c++ c recursion

如何在保持代码的递归特性的同时使此函数线程安全?

int foo(char *p)
 {
  static int i = 0;
   if (*p == '\0') return i;
   i++;
 return foo(p+1);
}

3 个答案:

答案 0 :(得分:5)

#include <iostream>

using namespace std;

int foo(char* p, int start)
{
    if (*p == 0) return start;
    return foo(p+1, start+1);
}

int main()
{
    char test[] = "HI THERE";

    cout << foo(test, 0);

    return 0;
}

答案 1 :(得分:3)

在C ++ 11中,您可以使用thread_local

int foo(char *p)
{
  thread_local int i = 0;
  if (*p == '\0') return i;
  i++;
  return foo(p+1);
}

我希望这个函数只是一个例子,因为i=0只会在我的例子中执行一次(在你的例子中)和一次每个线程

较旧的编译器有时支持static __thread作为C ++之前的替代方案。

答案 2 :(得分:1)

int foo(char *p, int i = 0)
{
    if(*p == '\0')
        return i;
    return foo(p+1, i+1);
}

递归很好,但是如果创建堆栈帧,它可能比循环效率低。这是导致堆栈溢出的最简单方法。我建议摆脱它。以下内容更简单,速度更快:

int foo(char *p)
{
    return strlen(p);
}

或者更好的是,只需直接致电strlen并摆脱foo

请注意,这非常不安全。如果'\0'没有来怎么办?你会读到谁知道什么......