Threads and stdio and HANDLE

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jan 29 05:26:11 PST 2015


On Wednesday, 28 January 2015 at 11:50:46 UTC, Danny wrote:
> Hello,
>
> I'm trying to write some toy examples using threads in D.
>
> Is the std.stdio.File thread-local or shared? Is flockfile used 
> when I synchronize on it?
>
> I tried checking phobos myself and found some things I don't 
> get (in stdio.d):
>
> alias FLOCK = flockfile;
>
> this(this) { @trusted
>   if(fps_)
>     FLOCK(fps_);
> }
>
> What is "this(this)"?
>
this(this) is the constructor syntax for construction of an 
already
  initialised struct. (sort of equivalent to the C++
class foo {
     foo(const foo& other)
     {
         ...
     }
} )

used like
  struct somestruct
{
     ...
     this()
     {
         writeln("calling this()");
     }
     this(this)
     {
         writeln("calling this(this)");
     }
}
...
auto foo = somestruct(); //prints calling this()
auto baz = foo;              //prints calling this(this)

> If I want to write to stdout from a thread, do I use 
> LockingTextWriter? File? shared File? Does each thread have the 
> same stdout?
Yes

>
> Finally, I'm trying to come to grips with "shared":
>
> What does specifying "shared class" or "shared struct" do?

all methods are marked as shared
(similar to what final class quux { ... } does compared to just 
class quux { ... } )

> The first use of shared is to signal to the compiler that it 
> should not store the variable in thread-local storage. But when 
> I acquire a lock (using "synchronized", say), I'm supposed to 
> cast away the "shared", right?
IIRC ,yes.
as in
class Bar { ... }
auto foo(shared Bar bar)
{
     synchronized(bar) //acquire lock
     {
         Bar not_shared_bar = cast(Bar) bar;
         ...
         //use not_shared_bar here as thread local.
         // No races can occur because of the lock.
         // DO NOT allow references to non_shared_bar to escape
         // as using them outside the synchronised could lead to 
racing
     }
}
> Does it then still know that it's not thread-local (but that I 
> ensured that nobody else accesses it for the time being)?
>
No. it's up to you to make sure that no non-shared references 
escape


More information about the Digitalmars-d-learn mailing list