Hi Manu,

thanks for taking some time to answer. I just wrote a little Java program that 
does just the same:

public static void main(String[] args)
{
    Thread thread1 = new Thread(new HelloWorldThread());
    thread1.start();
        
    Thread thread2 = new Thread(new HelloWorldThread());
    thread2.start();
                
    Thread thread3 = new Thread(new HelloWorldThread());
    thread3.start();
                
    System.out.println("done");
}

"Hello world" is printed to the console as soon as I jump in the Java eclipse 
debugger over any thread?.start(). I have a breakpoint on the last 
sysout("done") line to prevent the program to terminate before I'm done with 
seeing things in the debugger. So there is no single Thread.sleep here and no 
yielding. This is the behavior I would expect from my D program as well.

This somehow reminds me of older versions of VisualWorks Smalltalk where 
multi-threading was not preemptive, but cooperative: threads with same priority 
do not interrupt each other but run till completion unless one of the threads 
does a Processor.yield.

When your programm was irresponsible in a certain situation you added some more 
Processor.yield to the code and things were better. But at the same time the 
additional yields caused some more incorrectly synchronized access to shared 
data to cause race conditions. Without people that do not understand 
concurrency well this was not easy ...

I still don't understand why my D program behaves as described in my initial 
post and not like the corresponding Java program. Is this really the debugger?

Cheers, Oliver

-------- Original-Nachricht --------
> Datum: Wed, 8 Feb 2012 01:01:22 +0200
> Von: Manu <turkey...@gmail.com>
> An: "digitalmars.D" <digitalmars-d@puremagic.com>
> Betreff: Re: Output to console from DerivedThread class strange

> I'm not sure why you are asking me about this?
> 
> The problem I think is with your understanding of the debugger, and sleep
> states of other threads.
> If you break on a breakpoint to step the program, all threads be stopped.
> If you step the code one line at a time in the debugger, it will not yield
> to the other threads while stepping, the new thread will not begin until
> the current thread has a reason to yield, and you won't see anything.
> When you step over the sleep, the program will execute the sleep, which
> will then cause a wait for some moments, immediately handing the execution
> to another thread for that time, and during this time the other thread
> will
> have opportunity to print their message and exit. Sleep will always yield
> the current thread immediately, even if you sleep for 0.
> With the sleep calls commented out like that, the main thread will not
> reach a point where it will be forced to yield to another thread, so you
> won't see it until the end.
> 
> What I expect to happen, without breaking to the debugger, with all sleeps
> commented out; the 3 prints will happen after the program exits (it will
> take some time before the main thread yields to the new created threads)
> ..
> if you uncomment any of those sleeps, all prints coming before it will
> print at that time...
> 
> On 8 February 2012 00:28, Oliver Puerto <saxo...@gmx.de> wrote:
> 
> > Hello,
> >
> > I have a question concerning threading. I use Visual Studio with the
> > Visual-D plugin. The problem is somehow that when executing the code
> below
> > "Derived thread running." is displayed 3 times on the console but not
> > before "return 0" is reached. Then "Derived thread running." is
> displayed
> > 3x all of a sudden, but not each one by one after each other. This looks
> a
> > bit strange to me.
> >
> > When I unquote the Thread.sleeps after every d?.start() "Derived thread
> > running." is displayed immediately on the console when stepping over
> > Thread.sleep with the debugger. When stepping over d*.start() still
> nothing
> > happens regardless how much time I wait in the debugger till I jump to
> the
> > next line. I can't make really head or tail of this. I would expect
> > "Derived thread running." to appear on the console somewhen after
> > d?.start() was executed. Thereafter I could do an additional
> Thread.sleep
> > if I wanted to. But this would not be necessary for any "Derived thread
> > running." message to be displayed on the console.
> >
> > I believe there is something with the debugger I don't understand or
> don't
> > realize. Any suggestions/ideas?
> >
> > Thank you, Oliver Plow
> >
> >
> > import std.stdio, core.thread;
> >
> > import DerivedThread;
> >
> > int main(string[] argv)
> > {
> >    DerivedThread dt1 = new DerivedThread();
> >    dt1.start();
> >    // Thread.sleep(dur!("seconds")( 1 ));
> >
> >    DerivedThread dt2 = new DerivedThread();
> >    dt2.start();
> >    // Thread.sleep(dur!("seconds")( 1 ));
> >
> >    DerivedThread dt3 = new DerivedThread();
> >    dt3.start();
> >    // Thread.sleep(dur!("seconds")( 1 ));
> >
> >    Thread.sleep(dur!("seconds")( 4 ));
> >    return 0;
> > }
> >
> > ------------------ DerivedThread.d ------------------
> >
> > import std.stdio, core.thread;
> >
> > class DerivedThread : Thread {
> >        this() {
> >                super( &run );
> >        }
> >
> > private :
> >        void run() {
> >                writeln("Derived thread running.");
> >        }
> > }
> > --
> > Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
> > belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de
> >

-- 
Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir
belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de

Reply via email to