A singleton is a class which controls the number of objects to be created from this class. Most often there shall be just a single object from a certain type. The basic principle to reach this is to limit the access to the constructor, i.e. making it private. There is a static function which allowes a single point of access to the single object.
There is a controversial discussion if a singleton is good design. The main critique is that it is reachable from any scope, thus appearing as a global variable. It is also not trivial to make it thread-safe (pre C++11). Destruction of a singleton is another issue. Also, lazy initialization might not be what you want in a time-critical system. I personally suggest in reactive time-critical systems to allocate your resources at start-up time if possible. This will guarantee by design that there is only a certain number of objects of a certain type. Also the initialization order may be established easliy. The objects shall communicate via appropriate communication channels.
There are a couple of issues to think about when deciding to use a singleton and choosing the right implementation.
threadsafety of a singleton. There is the DCLP (double checked locking pattern)  to make the original GOF singleton  thread-safe. As recovered several years later, this may fail under certain circumstances . In C++11 there is a thread-safe implementation due to a new memory model. The Meyers Singleton  is also thread-safe in C++11.
destruction. The original GOF singleton cannot be destructed. At the end of the program it doesn´t free its resources. The Meyers Singletons destructor is called at the programs end. If you need to destroy a singleton during runtime and re-create it later, the phoenix singleton  comes in handy.
 D.C. Schmidt, T.Harrison; Double-Checked Locking; Pattern Languages of Program Design 3, 1997
 E.Gamma, R.Johnson, R.Helm, J.Vlissides; Design Pattern; Prentice Hall 1994
 S.Meyers, A.Alexandrescu; C++ and the Perils of Double-Checked Locking; 2004
 H.Sutter; herbsutter.com
 S.Meyers; More Effective C++; 1996
 A.Alexandrescu; Modern C++ Design, Addison-Wesley, 2001