Здравствуйте!
Недавно понял, что ничего не знаю в принципе об паттерне "одиночка"... Может даже вообще ничего не знаю?...
Начал читать кучу книг, особенно заинтересовала "Современное проектирование С++ Александреску"...
Взял из пример одиночку Маерса, т.к. мне понравилось, что не надо заботится об утечках, добавил пару своих функций и пытаюсь теперь понять на сколько оно thread-safe...
Собрал у себя следующее приложение:
#include <Windows.h>
#include <process.h>
#include <iostream>
#include <fstream>
class CNetworkLog
{
std::ofstream m_file;
CNetworkLog() {
InitializeCriticalSection(&m_cs);
m_file.open("nlog.txt", std::ios::app);
};
~CNetworkLog() {
DeleteCriticalSection(&m_cs);
m_file.close();
};
CNetworkLog(const CNetworkLog &clone) {};
CNetworkLog& operator=(CNetworkLog &rhv){};
CRITICAL_SECTION m_cs;
public:
static CNetworkLog& getInstance() {
static CNetworkLog instance;
return instance;
};
void WriteLog(const char * msg) {
EnterCriticalSection(&m_cs);
m_file << msg << std::endl;
LeaveCriticalSection(&m_cs);
}
};
unsigned int __stdcall threadFunc(void *args)
{
CNetworkLog &log = CNetworkLog::getInstance();
log.WriteLog("test");
_endthreadex(0);
return 0;
}
int main()
{
const int max = 100;
HANDLE hHandles[max];
for (int i = 0; i < max; ++i) {
hHandles[i] = (HANDLE)_beginthreadex(NULL, 0, &threadFunc, NULL, 0, 0);
}
WaitForMultipleObjects(max, hHandles, TRUE, INFINITE);
for (int i = 0; i < max; ++i) {
CloseHandle(hHandles[i]);
}
return 0;
}
Конфигурация компьютера: i5-2300 2.8GHZx2, Win7 x86
Собирал на VS2010.
Где-то в интернете я прочитал, что одиночка Маерса не thread-safe и нужно применить синхронизацию при создании экземпляра...
В принципе у меня все работает, но правильно ли?