C++类对象在多线程中多次创建
时间: 2024-10-13 16:08:11 浏览: 20
在C++中,类对象在多线程环境下可能会遇到并发问题,特别是当多个线程尝试同时创建同一对象时。要避免这种情况,通常采用以下策略:
1. **线程安全初始化**[^1]:使用C++11后的`std::lock_guard`或`std::unique_lock`与`std::shared_mutex`来保证对共享资源(如静态成员)的互斥访问。比如,可以这样创建线程安全的对象实例:
```cpp
std::mutex mtx;
class MyClass {
public:
static std::shared_ptr<MyClass> getInstance() {
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new MyClass();
}
return instance;
}
private:
static std::shared_ptr<MyClass> instance;
};
```
2. **使用单例模式**[^2]:如示例所示,可以使用线程安全的单例模式,确保只有一个实例存在。这里的关键在于同步构造过程:
```cpp
class SingletonForMultithread {
mutable std::mutex mtx_;
bool finished_{false};
// 构造函数
SingletonForMultithread() {
std::lock_guard<std::mutex> lock(mtx_);
// ...漫长的初始化逻辑...
finished_ = true;
}
static SingletonForMultithread* GetInstance() {
static SingletonForMultithread instance;
return &instance;
}
};
```
当多个线程试图获取实例时,它们会顺序地等待构造完成。
阅读全文