C++多线程单例模式代码实现
时间: 2023-07-28 21:07:44 浏览: 142
以下是C++中多线程安全的单例模式代码实现:
```cpp
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mutex;
Singleton() {}
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
```
在该实现中,我们使用了`std::mutex`来保证在多线程环境下单例类的唯一性。`mutex`是一个静态成员变量,用于保证在多线程环境下对`instance`的访问是互斥的。在`getInstance`方法中,我们使用`std::lock_guard<std::mutex>`来保证在访问`instance`时,互斥锁被正确地加锁和解锁。这样就可以保证在多线程环境下,单例类的唯一实例只会被创建一次。
相关问题
c++ 线程安全的单例模式代码实现
可以使用双检锁机制实现线程安全的单例模式。代码如下:
```cpp
class Singleton {
public:
static Singleton* getInstance() {
if (m_instance == nullptr) {
std::lock_guard<std::mutex> lock(m_mutex);
if (m_instance == nullptr) {
m_instance = new Singleton();
}
}
return m_instance;
}
private:
Singleton() {}
static Singleton* m_instance;
static std::mutex m_mutex;
};
Singleton* Singleton::m_instance = nullptr;
std::mutex Singleton::m_mutex;
```
在 `getInstance()` 函数中,首先判断实例是否已经存在。如果存在,直接返回实例指针。如果不存在,则加锁,再次判断实例是否存在。如果不存在,则创建实例并返回实例指针。加锁保证了多个线程同时调用 `getInstance()` 函数时只有一个线程可以创建实例,从而保证了线程安全性。
c++线程安全的单例模式代码实现
C++线程安全的单例模式可以通过使用双重检查锁定(Double-Checked Locking)来实现。以下是一个示例代码:
```cpp
#include <iostream>
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;
Singleton() {}
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
void showMessage() {
std::cout << "Hello, I am a singleton object!" << std::endl;
}
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
int main() {
Singleton* singleton1 = Singleton::getInstance();
singleton1->showMessage();
Singleton* singleton2 = Singleton::getInstance();
singleton2->showMessage();
return 0;
}
```
在上述代码中,我们使用了一个静态指针`instance`来保存单例对象的实例。在`getInstance()`方法中,我们首先检查`instance`是否为空,如果为空,则使用互斥锁`mtx`进行加锁,然后再次检查`instance`是否为空。这样可以确保只有一个线程能够创建单例对象。如果`instance`为空,我们就创建一个新的单例对象,并将其赋值给`instance`。最后,我们返回`instance`指针。
这种实现方式可以保证在多线程环境下只创建一个单例对象,并且在对象创建完成后,其他线程可以直接获取到已创建的对象。
阅读全文