On 09/11/2017 01:51 AM, John Burton wrote:

> I wrote this program :-
>
> import std.stdio;
> import std.concurrency;
>
> int data;
>
> void display()
> {
>     writeln("Address is ", &data);
> }
>
> void main()
> {
>     auto tid1 = spawn(&display);
>     auto tid2 = spawn(&display);
>     auto tid3 = spawn(&display);
> }
>
> It displayed :-
>
> Address is 51AD20
> Address is 51AD20
> Address is 51F6D0
> Address is 521AC0
>
> This indicated to me that a thread local variable does in fact have a
> different address to other thread's instances of the same thread so you
> can in fact pass the address to another thread and access it from there
> via pointer, which is what I'd hope.

The output is deceptive. 'data' is thread-local: Every thread has its own copy. The following program indicates the variables are different:

import std.stdio;
import std.concurrency;
import core.thread;

int data;

class Lock {
}

void display(shared Lock lock)
{
    synchronized (lock) {
        writeln("Address is ", &data);
        ++data;
        writeln(data);
    }
}

void main()
{
    auto lock = new shared Lock();
    auto tid1 = spawn(&display, lock);
    auto tid2 = spawn(&display, lock);
    auto tid3 = spawn(&display, lock);
    thread_joinAll();
    writeln(data);
}

Sample output (yes, 64-bit build):

Address is 7F8443BCE580
1
Address is 7F843BFFF580
1
Address is 7F844441F580
1
0

> Interesting it also (sometimes) prints one of the lines twice quite often.

That's a coincidence that different threads see 'data' at the same address value but they are still different objects. Actually, I'm surprised that they are reported differently. If I remember correctly, in the past it would report the same address. Perhaps a case of ASLR?

> I wonder if this is the same "bug" as
> https://issues.dlang.org/show_bug.cgi?id=17797 that doesnt even require
> any reading? (platform is windows 7 DMD32 D Compiler v2.076.0)

I doubt it unless you get 4 addresses instead of 3.

Ali

Reply via email to