C++并发编程(6):单例模式、once_flag与call_once、call_once实现单例
发布人:shili8
发布时间:2024-12-23 11:41
阅读次数:0
**C++ 并发编程 (6) : 单例模式、once_flag 与 call_once**
在 C++ 中,多线程编程是非常重要的。我们已经讨论过了 mutex 和 lock_guard 等相关概念。在本文中,我们将探讨单例模式、once_flag 和 call_once 的使用。
### 单例模式单例模式是一种常见的设计模式,它确保某个类只有一个实例,并提供全局访问点。例如,日志系统或配置文件系统通常会使用单例模式来保证唯一性。
在 C++ 中,我们可以使用 mutex 来实现单例模式。下面是一个简单的示例:
cppclass Singleton {
public:
static Singleton& getInstance() {
std::lock_guard<std::mutex> lock(mutex_);
if (instance_ == nullptr) {
instance_ = new Singleton();
}
return *instance_;
}
private:
Singleton() {}
~Singleton() {}
static std::mutex mutex_;
static Singleton* instance_;
};
std::mutex Singleton::mutex_;
Singleton* Singleton::instance_ = nullptr;
在这个例子中,我们使用了一个静态的 mutex 来保护实例化过程。每次调用 getInstance() 时,会检查是否已经有实例存在,如果没有,则创建一个新的实例。
### once_flagonce_flag 是 C++11 中引入的一种新功能,它允许我们在多线程环境中使用 call_once 函数来确保某个函数只被执行一次。
下面是一个简单的示例:
cppclass Singleton {
public:
static void init() {
std::call_once(flag_, [] { instance_ = new Singleton(); });
}
private:
static once_flag flag_;
static Singleton* instance_;
};
once_flag Singleton::flag_;
Singleton* Singleton::instance_ = nullptr;
在这个例子中,我们使用了一个静态的 once_flag 来保护实例化过程。每次调用 init() 时,会检查是否已经有实例存在,如果没有,则创建一个新的实例。
### call_oncecall_once 是 C++11 中引入的一种新功能,它允许我们在多线程环境中使用一次函数来确保某个函数只被执行一次。
下面是一个简单的示例:
cppclass Singleton {
public:
static void init() {
std::call_once(flag_, [] { instance_ = new Singleton(); });
}
private:
static once_flag flag_;
static Singleton* instance_;
};
once_flag Singleton::flag_;
Singleton* Singleton::instance_ = nullptr;
在这个例子中,我们使用了一个静态的 once_flag 来保护实例化过程。每次调用 init() 时,会检查是否已经有实例存在,如果没有,则创建一个新的实例。
### call_once 实现单例我们可以使用 call_once 来实现单例模式。下面是一个简单的示例:
cppclass Singleton {
public:
static void init() {
std::call_once(flag_, [] { instance_ = new Singleton(); });
}
private:
static once_flag flag_;
static Singleton* instance_;
};
once_flag Singleton::flag_;
Singleton* Singleton::instance_ = nullptr;
在这个例子中,我们使用了一个静态的 once_flag 来保护实例化过程。每次调用 init() 时,会检查是否已经有实例存在,如果没有,则创建一个新的实例。
### 总结在本文中,我们讨论了单例模式、once_flag 和 call_once 的使用。在 C++ 中,我们可以使用 mutex 来实现单例模式。在多线程环境中,我们可以使用 once_flag 和 call_once 来确保某个函数只被执行一次。我们还展示了如何使用 call_once 来实现单例模式。
### 参考* 《C++ Primer》第5 版* 《Effective C++》第3 版* 《Modern C++ Design》第1 版

