1

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

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

3 回答 3

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;
}
于 2013-02-28T20:08:36.460 回答
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++11 之前的替代方案。

于 2013-02-28T20:09:23.860 回答
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'不来怎么办?你只会读到谁知道什么...

于 2013-02-28T20:16:51.380 回答