How to use globals correctly?

Jonathan M Davis newsgroup.d at jmdavisprog.com
Tue Mar 6 18:46:04 UTC 2018


On Tuesday, March 06, 2018 18:34:34 bauss via Digitalmars-d-learn wrote:
> On Monday, 5 March 2018 at 19:51:33 UTC, Steven Schveighoffer
>
> wrote:
> > On 3/5/18 2:25 PM, Marc wrote:
> >> Can __gshared be used instead of static in the singleton
> >> pattern? I, comming from C++, ignorantly, have never used
> >> _gshared so I went to static instead of (being static also
> >> means thread-safe, as far I know)...
> >
> > static in D is thread safe, because it's thread-local.
> > __gshared is shared between threads, so it's not thread safe,
> > but has the exact same type as just static data.
> >
> > Can you use it for singleton? Sure, classic singleton is shared
> > between threads. But using thread-local data, you can solve the
> > singleton problem in a better way:
> >
> > https://wiki.dlang.org/Low-Lock_Singleton_Pattern
> >
> > Note, it still uses __gshared, which means it doesn't protect
> > you from race conditions when you actually USE the singleton
> > object. This means you need some synchronization inside the
> > methods.
> >
> > -Steve
>
> Singletons are always smelly code tbh.
>
> Especially in D with thread-local storage.
>
> I can't think of a situation where you truly need singletons in D.

I confess that I've never really understood why some folks dislike
singletons so much, but then again, I've only rarely found cases where I
thought that they made sense, and I gather that some folks out there use the
singleton pattern way too much (I've heard it suggested that it's because it
was one of the few design patterns from the design pattern book that was
easy). In fact, one of my coworkers was telling me at one point about how
someone had argued to him about how a "doubleton" pattern made sense, which
just seems crazy to me, but I've found that a disturbingly large percentage
of programmers are not what I would consider competent.

I think that the singleton pattern should be used when it really makes sense
to use it, but in most cases, there's no reason to restrict the type to a
singleton. And I expect that the dislike for singletons comes from them
being used far too often when it clearly made no sense.

The one place that I can think of that I've used singletons in the last
decade or so is with the LocalTime and UTC classes for time zones (both in
std.datetime and in the C++ version that I wrote for work at one point).
Having multiple instances of those classes made no sense and would have been
pointlessly inefficient. But at the moment, that's the only case I can think
of where I've used singletons. They just don't make sense very often.

- Jonathan M Davis



More information about the Digitalmars-d-learn mailing list