///////////////////////////////////////////////////////////////////// // SingletonBase.cpp - base class for useful Singletons // // // // Jim Fawcett, CSE776 - Design Patterns, Fall 2017 // ///////////////////////////////////////////////////////////////////// #include "SingletonBase.h" #include ///////////////////////////////////////////////////////////////////// // Locking classes // - expected to acquire lock on construction and release on destruction // #ifdef TEST_SINGLETONBASE #include #include "../Locks/Locks.h" using namespace Singleton; using namespace Utilities; using namespace Locks; int main() { title<'='>("Testing SingletonBase"); putLine(); Singleton::log.logging = true; Singleton::log.set(&std::cout); title<'-'>("testing SingletonBase"); using NLSingleton = SingletonBase; NLSingleton* pInstance1 = NLSingleton::Instance(); NLSingleton* pInstance2 = NLSingleton::Instance(); std::cout << "\n address of instance #1 = " << pInstance1; std::cout << "\n address of instance #2 = " << pInstance2; pInstance1->Release(); pInstance2->Release(); putLine(); title<'-'>("testing SingletonBase"); using LSingleton = SingletonBase; std::function tProc = []() { size_t count = 0; LSingleton* pInstance = nullptr; for (size_t i = 0; i < 5; ++i) { ++count; pInstance = LSingleton::Instance(); } for (size_t i = 0; i < count; ++i) pInstance->Release(); }; std::thread t1(tProc); std::thread t2(tProc); t1.join(); t2.join(); putLine(2); return 0; } #endif