如何在保持代码的递归特性的同时使此函数线程安全?
int foo(char *p)
{
static int i = 0;
if (*p == '\0') return i;
i++;
return foo(p+1);
}
答案 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'
没有来怎么办?你会读到谁知道什么......