April 06, 2009 Re: Thread pause and resume | ||||
---|---|---|---|---|
| ||||
Posted in reply to Fawzi Mohamed | Fawzi Mohamed wrote:
> 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 [...]
^
Insert comma here.
Andrei
|
April 07, 2009 Re: Thread pause and resume | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steve Teale | On Mon, 06 Apr 2009 10:14:41 -0400, Steve Teale <steve.teale@britseyeview.com> wrote:
> 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.
Okay, now follow SuspendThread and ResumeThread and you'll eventually run into a (on windows) a function call which is documented on MSDN with a bunch of warnings. Admittedly, I traced this a while ago, so pause and resume might have been re-purposed away from GC use, but this used to be the case.
|
Copyright © 1999-2021 by the D Language Foundation