如何在保持代码的递归性质的同时使这个函数线程安全?
int foo(char *p)
{
static int i = 0;
if (*p == '\0') return i;
i++;
return foo(p+1);
}
#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;
}
在 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 之前的替代方案。
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'
不来怎么办?你只会读到谁知道什么...