View mode: basic / threaded / horizontal-split · Log in · Help
April 06, 2009
Thread pause and resume
Earlier versions of D2.x used std.thread which had pause() and resume(). The later versions use core.thread where these appear to be missing.

Any portable workaround suggestions?
April 06, 2009
Re: Thread pause and resume
Steve Teale wrote:
> Earlier versions of D2.x used std.thread which had pause() and resume(). The later versions use core.thread where these appear to be missing.
> 
> Any portable workaround suggestions?

Monitors.
They're even built-in in the language (synchronized statement)
April 06, 2009
Re: Thread pause and resume
On Mon, 06 Apr 2009 05:57:24 -0400, Steve Teale  
<steve.teale@britseyeview.com> wrote:

> Earlier versions of D2.x used std.thread which had pause() and resume().  
> The later versions use core.thread where these appear to be missing.
>
> Any portable workaround suggestions?
>

Also, these functions (if you dig into their implementation) are  
documented as being for debuggers and/or GCs only. Specifically, they can  
not be used for synchronization, etc.
April 06, 2009
Re: Thread pause and resume
Robert Jacques Wrote:

> On Mon, 06 Apr 2009 05:57:24 -0400, Steve Teale  
> <steve.teale@britseyeview.com> wrote:
> 
> > Earlier versions of D2.x used std.thread which had pause() and resume().  
> > The later versions use core.thread where these appear to be missing.
> >
> > Any portable workaround suggestions?
> >
> 
> Also, these functions (if you dig into their implementation) are  
> documented as being for debuggers and/or GCs only. Specifically, they can  
> not be used for synchronization, etc.

In 2.06 they were just:

   /**
    * Suspend execution of this thread.
    */
   void pause()
   {
	if (state != TS.RUNNING || SuspendThread(hdl) == 0xFFFFFFFF)
	    error("cannot pause");
   }

   /**
    * Resume execution of this thread.
    */
   void resume()
   {
	if (state != TS.RUNNING || ResumeThread(hdl) == 0xFFFFFFFF)
	    error("cannot resume");
   }

No prohibitions or warnings.

In some code I wrote at that time, I had a worker thread pool. When a thread had done its job it would mark itself as available then pause. The listener thread would then resume it or start one that had never been started. I'm trying to get it running in 2.26. There are functions of the same name there but they are nested inside SuspendAll and ResumeAll, and so not accessible.
April 06, 2009
Re: Thread pause and resume
grauzone Wrote:

> Steve Teale wrote:
> > Earlier versions of D2.x used std.thread which had pause() and resume(). The later versions use core.thread where these appear to be missing.
> > 
> > Any portable workaround suggestions?
> 
> Monitors.
> They're even built-in in the language (synchronized statement)

Unfortunately, Monitors are not documented, and the documentation for classes says quite specifically that the class property __monitor should not be used in user code.

I have tried to extract an Object.Monitor interface using this property and to experiment with its lock and unlock methods, but when I try to call these methods I just get an access violation. Same if I assume what it returns is a pointer so struct Monitor, or an instance of interface object.Monitor.

How would you do it?
April 06, 2009
Re: Thread pause and resume
== Quote from Steve Teale (steve.teale@britseyeview.com)'s article
> Earlier versions of D2.x used std.thread which had pause() and resume(). The later versions use
core.thread where these appear to be missing.
> Any portable workaround suggestions?

Use thread synchronization and signaling primitives like the ones
in core.sync.
April 06, 2009
Re: Thread pause and resume
== Quote from Steve Teale (steve.teale@britseyeview.com)'s article
>
> In some code I wrote at that time, I had a worker thread pool. When a thread had done its job it would mark itself as available then
pause. The listener thread would then resume it or start one that had never been started. I'm trying to get it running in 2.26. There
are functions of the same name there but they are nested inside SuspendAll and ResumeAll, and so not accessible.

This sounds like a classic producer/consumer case.  I suggest using condition
variables (core.sync.condition with core.sync.mutex).
April 06, 2009
Re: Thread pause and resume
Sean Kelly Wrote:

> == Quote from Steve Teale (steve.teale@britseyeview.com)'s article
> > Earlier versions of D2.x used std.thread which had pause() and resume(). The later versions use
> core.thread where these appear to be missing.
> > Any portable workaround suggestions?
> 
> Use thread synchronization and signaling primitives like the ones
> in core.sync.

It's a shame stuff like core.sync doesn't make it into the official changelog with the dmd releases...
April 06, 2009
Re: Thread pause and resume
== Quote from Jason House (jason.james.house@gmail.com)'s article
>
> It's a shame stuff like core.sync doesn't make it into the official changelog with the dmd releases...

That's my fault I suppose.  But since core.sync still appears to be
missing from the import path, the next release can contain the
announcement :-)
April 06, 2009
Re: Thread pause and resume
On 2009-04-06 20:49:50 +0200, Steve Teale <steve.teale@britseyeview.com> said:

> Steve Teale Wrote:
> 
>> Sean Kelly Wrote:
>> 
>>> == Quote from Steve Teale (steve.teale@britseyeview.com)'s article
>>>> 
>>>> In some code I wrote at that time, I had a worker thread pool. When a 
>>>> thread had done its job it would mark itself as available then
>>> pause. The listener thread would then resume it or start one that had 
>>> never been started. I'm trying to get it running in 2.26. There
>>> are functions of the same name there but they are nested inside 
>>> SuspendAll and ResumeAll, and so not accessible.
>>> 
>>> This sounds like a classic producer/consumer case.  I suggest using condition
>>> variables (core.sync.condition with core.sync.mutex).
>> 
>> The problem is at the moment, that the D documentation covers the 
>> language, and Phobos - the latter option exposes Object to some extent.
>> 
>> Anything that is in core.* is undocumented and you have to 'rtfsc' - if 
>> you can find it. I can't even find "core.sync" in D files under dmd. 
>> Can you point me in the right direction please.
>> 
>> Thanks Steve
>> 
> As an aside, I realize that Thread.suspend is dodgy, it's been 
> deprecated in Java and C#. Can the metaprogrammers out there come up 
> with a way to insist that a particular member function is called only 
> from the instance that it 'belongs' to. Then presumably it could be 
> made safe.

no pause and resume remains a bad idea because it can stop the thread 
in any state, even while it has acquired a lock in any non signal safe 
kernel function, which means that any other thread could block calling 
one of these functions until the thread is released, which if you are 
not very careful might stop the thread that should release it, 
deadlocking the whole program.

Fawzi
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home