Thread-safety and lazy-initialization of libraries

H. S. Teoh via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Jun 30 14:54:19 PDT 2014


On Mon, Jun 30, 2014 at 11:36:21PM +0200, Mike Wey via Digitalmars-d-learn wrote:
> On 06/30/2014 11:05 PM, bearophile wrote:
> >Sergey Protko:
> >
> >>libmpg123 has mpg123_init and mpg123_exit functions, which are not
> >>thread-safe, so we should to call them only once per process. Most
> >>of useful libraries also has such stuff. But manual initialization
> >>is killing all beauty of high-level bindings.
> >
> >I think module "static this" is thread-local, so in theory you can
> >use that. But I don't know if it's a good idea to perform heavy
> >computations inside those module static this.
> >
> >Bye,
> >bearophile
> 
> You'll need to use a `shared static this` if those functions can be
> called only once per process.
> A regular static this is executed once per Thread.
[...]

Depending on how lazy you want initialization to be, you might want to
consider using __gshared (for process-global state) with appropriate
synchronization locks to make sure threads don't stomp over each other.
Then you can check if component X has been initialized (per process)
each time a thread calls some function that depends on X, and if it is,
initialize it, if not, just do nothing (or return the global instance).


T

-- 
Verbing weirds language. -- Calvin (& Hobbes)


More information about the Digitalmars-d-learn mailing list