C++ bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Ti

C++ bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Ti,c++,c,thread-safety,C++,C,Thread Safety,bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Tim Post:可以返回静态局部变量。事实上,您甚至可以返回指向它们的引用/指针,并让调用者修改它们。在多线程上下文中,这可能会产生有趣的结果。它们显然是“范围化”的事实不会改变它们的生存期不是普通局部变量的生存期,而是全局变量的生存期。这是相当


bal和Local指的是作用域,而不是存储类。可以返回静态局部变量,只要调用方不修改它们。它们仍然在分配它们的函数中起作用。@WhirlWind:我更正了我的回答,以澄清我使用“全局”和“局部”字来指定变量的生存期,这在多线程上下文中才是真正重要的。@Tim Post:可以返回静态局部变量。事实上,您甚至可以返回指向它们的引用/指针,并让调用者修改它们。在多线程上下文中,这可能会产生有趣的结果。它们显然是“范围化”的事实不会改变它们的生存期不是普通局部变量的生存期,而是全局变量的生存期。这是相当创新的+1.
int getUniqueID()  
{  
    static int ID=0;  
    return ++ID;  
}
int getUniqueIDBase()  
{  
    static int ID=0;  
    return ++ID;  
}

int getUniqueID()
{
    return getUniqueIDBase() << k + thread_id;
}
int getUniqueID()  
{
   static bool initialized = false;
   static int ID;
   if( !initialized )
   {
      sleep(1);
      initialized = true;

      sleep(1);
      ID = 1;      
   }

   sleep(1);
   int tmp = ID;

   sleep(1);
   tmp += 1;

   sleep(1);
   ID = tmp;

   sleep(1);
   return tmp;
}
int getUniqueID()  
{  
    static std::atomic<int> ID{0};  
    return ++ID;  
}
int getUniqueID()  
{  
    static int ID=0;  
    return ++ID;  
}
private_to_the_next_function int ID = 0 ;

int getUniqueID()  
{  
    return ++ID;  
}
bool isObjectToBeConstructed = false ;
int iteration = 0 ;

struct MyObject
{
   MyObject() { std::cout << "*** MyObject::MyObject() ***" << std::endl ; }
   ~MyObject() { std::cout << "*** MyObject::~MyObject() ***" << std::endl ; }
};

void myFunction()
{
   std::cout << "   myFunction() : begin with iteration " << iteration << std::endl ;

   if(iteration < 3)
   {
      ++iteration ;
      myFunction() ;
      --iteration ;
   }
   else if(isObjectToBeConstructed)
   {
      static MyObject myObject ;
   }

   std::cout << "   myFunction() : end with iteration " << iteration << std::endl ;
}


int main(int argc, char* argv[])
{
   if(argc > 1)
   {
      std::cout << "main() : begin WITH static object construction." << std::endl ;
      isObjectToBeConstructed = true ;
   }
   else
   {
      std::cout << "main() : begin WITHOUT static object construction." << std::endl ;
      isObjectToBeConstructed = false ;
   }

   myFunction() ;

   std::cout << "main() : end." << std::endl ;
   return 0 ;
}
main() : begin WITHOUT static object construction.
   myFunction() : begin with iteration 0
   myFunction() : begin with iteration 1
   myFunction() : begin with iteration 2
   myFunction() : begin with iteration 3
   myFunction() : end with iteration 3
   myFunction() : end with iteration 2
   myFunction() : end with iteration 1
   myFunction() : end with iteration 0
main() : end.
main() : begin WITH static object construction.
   myFunction() : begin with iteration 0
   myFunction() : begin with iteration 1
   myFunction() : begin with iteration 2
   myFunction() : begin with iteration 3
*** MyObject::MyObject() ***
   myFunction() : end with iteration 3
   myFunction() : end with iteration 2
   myFunction() : end with iteration 1
   myFunction() : end with iteration 0
main() : end.
*** MyObject::~MyObject() ***