On 1/11/21 3:21 AM, Arafel wrote:
On 11/1/21 1:43, Tim wrote:
Hi there,

I have something like this:

class Foo{
     MongoClient db;

     this(){
         db = connectMongoDB("127.0.0.1");
         void delegate()[string] commands = ["start": &this.start];
     MessageService messenger = new MessageService(8081, commands);
     }

     void start(){
         // Do something with db
     }

MessageService is a thread that deals with socket communication. When a command comes in, it calls the appropriate delegate given to it by commands. When MessageService calls the delegate for start, db is null. If I call start() in the Foo constructor it works just fine. Am I missing something here? Do delegates get called outside of their class context? I know I could just pass the db into start but I want to work out exactly why this is happening

Thanks in advance

Hi,

Member variables are thread-local by default. At the very least you'll need to make `db` `shared` and manually verify that it's safe to use them before casting it away. So your code could end up a bit like this:

That isn't exactly true. Member variables are members of the object. If the object is shared, the member variables are shared. If the object is local the variables are local.

Thread local really only applies to *static* variables, such as globals or members declared static. If that were the case, yes, the other thread would not see the object.

I did not respond to the OP because I also don't know why it wouldn't work. But I also don't know what all the code is doing.

-Steve

Reply via email to