相关疑难解决方法(0)

函数静态变量是否在GCC中是线程安全的?

在示例代码中

void foo()
{
  static Bar b;
  ...
}
Run Code Online (Sandbox Code Playgroud)

使用GCC编译是否可以保证b以线程安全的方式创建和初始化?

在gcc的手册页中,找到了-fno-threadsafe-statics命令行选项:

不要发出额外的代码来使用C++ ABI中指定的例程来进行本地静态的线程安全初始化.您可以使用此选项在不需要线程安全的代码中略微减小代码大小.

  1. 这是否意味着,默认情况下,GCC的本地静态是线程安全的?所以没有理由明确保护,例如pthread_mutex_lock/unlock

  2. 如何编写可移植代码 - 如何检查编译器是否会添加其防护?或者关闭GCC的这个功能是否更好?

c++ static gcc initialization thread-safety

58
推荐指数
4
解决办法
3万
查看次数

这个静态对象的指针

如果我接受this一个静态对象并将其存储在Singleton对象的向量中,我可以假设指针在程序的整个生命周期中指向该对象吗?

c++ static

7
推荐指数
1
解决办法
418
查看次数

静态数据成员是否真的可以进行延迟初始化?

是否可以在真正需要时初始化Singleton的实例?

考虑从着名的"设计模式"中获取的这种模式:

class Singleton {
public:
   static Singleton* Instance();
protected:
   Singleton();
private:
   static Singleton* _instance;
}

Singleton* Singleton::_instance = 0; // unit.cpp

static Singleton* Singleton::Instance() {
   if (_instance == 0) {
       _instance = new Singleton;
   }
   return _instance;
}
Run Code Online (Sandbox Code Playgroud)

现在,我认为那里的模式存在问题,如果有人希望将库中的Singleton提供给其他人:如果用户Singleton::Instance()在初始化_instance之前从另一个编译单元调用(例如在静态数据成员初始化期间),然后跟随调用Singleton::Instance()可能会创建Singleton的另一个实例,并产生不需要的结果,因为_instance可能首先被初始化为0.

我认为一种解决方案是以这种方式初始化_instance:

Singleton* Singleton::_instance = Singleton::Instance();
Run Code Online (Sandbox Code Playgroud)

无论如何,这使得初始化对于那些不需要调用Singleton :: Instance()来初始化其静态数据的人来说不是"懒惰".

是否有更好的解决方案,以便在需要Singleton实例时可以进行初始化?

c++ lazy-loading

3
推荐指数
1
解决办法
5116
查看次数

标签 统计

c++ ×3

static ×2

gcc ×1

initialization ×1

lazy-loading ×1

thread-safety ×1