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この関数は、 (あなたの例では)1回だけ実行され、私の例ではスレッドごとに1回だけ実行される、単なる例であることを願っています。

古いコンパイラ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 に答える