On Friday, 31 January 2014 at 13:48:09 UTC, Nicolas F. wrote:
Hello,
I'm having some problems wrapping my head around shared classes
and whatnot.
So my application has a Logger class, which basically just
writes formatted messages to a target, of which debugGLLogger
inherits. What debugGLLogger does is simple in theory: it
supplies a callback function to OpenGL, and said callback
function uses a logger to write debug messages coming from
OpenGL to.
First off, I can't control the fact that it's a callback
function, or when it is called, as this is done by the driver,
windowing system, and so on.
Hence, to know which logger I need to write to, I used a static
variable which gets set to my main logger for OpenGL.
In theory, this should work, as I'm currently (or so I thought)
not using concurrency, which means that the static variable
should exist in all cases.
However, apparently the callback function is possibly called
from a different thread which I have no control over, as I've
had to painfully discover. My mainLogger static variable is
useless, and everything falls apart. I'm not sure where this
thread comes from, and maybe I'm just imagining things, but
since I see no other way the variable could suddenly become
null, I'm guessing that's the issue.
So in some way I've got to bring the "shared" keyword into
play, so I have a reference to a logger instance which I can
use across threads. However, apparently for that, the class
also needs to be shared, and I'm not sure if that's even the
"right" way to do things.
I've also thought that maybe I should utilise a seperate thread
to run all loggers in, and communicate with the loggers through
message-passing.
I'm not an experienced programmer, so I'd love to hear some
advice on how I could solve this.
You could always use __gshared instead of shared. Then it becomes
a global static variable and you don't have to deal with the
current shared mess. It comes with the canveat that it's not
safe. (as in not data-race safe)