كيفية تنفيذ نمط Singleton في C++ مع مراعاة تعدد الخيوط؟
مرحبًا بالجميع! أنا مطور C++ مبتدئ وأحاول فهم نمط Singleton. قرأت أنه نمط إنشائي يضمن وجود مثيل واحد فقط للفئة، ويوفر نقطة وصول عامة إليه.
كتبت تطبيقًا بسيطًا لـ Logger:
```cpp
class Logger {
public:
static Logger* getInstance() {
if (instance == nullptr) {
instance = new Logger();
}
return instance;
}
void log(const std::string& msg) {
std::cout << msg << std::endl;
}
private:
Logger() {}
static Logger* instance;
};
Logger* Logger::instance = nullptr;
```
لكن هناك عدة نقاط تزعجني:
1. في بيئة متعددة الخيوط، قد يتم إنشاء عدة مثيلات إذا استدعت خيطان getInstance() في نفس الوقت.
2. لا توجد آلية لحذف الكائن — مما يؤدي إلى تسرب الذاكرة.
3. رأيت إصدارات مختلفة: باستخدام mutex، std::call_once، أو static magic. أي منها هو الصحيح؟