std.parallelism changes done

dsimcha dsimcha at yahoo.com
Thu Mar 24 18:17:09 PDT 2011


On 3/24/2011 9:05 PM, Sönke Ludwig wrote:
>> This may not be an issue in the std.parallelism design. A TaskPool task
>> can safely wait on other tasks. What prevents this from causing a
>> deadlock is that calling yieldForce, spinForce, or waitForce on a task
>> that has not started executing yet will execute the task immediately in
>> the thread that tried to force it, regardless of where it is in the
>> queue.
>
> Indeed this pattern solves the problem to wait for the completion of a
> specific task. It also avoids a huge potential of deadlocks that a
> general yield() that does not take a task would have. However, it will
> not solve the general problem of one task waiting for another, which
> could be in terms of a condition variable or just a mutex that is used
> in the middle of the task execution.
>

Can you elaborate and/or provide an example of the "general" problem? 
I'm not quite sure what you're getting at.

>> Can you elaborate on this? The whole point of executeInNewThread() was
>> supposed to be that a TaskPool is not needed for simple cases.
>
> Well OK if that is the only purpose to provide a shortcut for (new
> Thread(&fun)).start then my suggestion may not make too much sense.
> However, I have some doubts that the advantage to have this shortcut
> here justifies the functional duplication of core.thread. Is there some
> specific use case where you would use a Task object but not a ThreadPool?

executeInNewThread() is useful where you only have a few Tasks, rather 
than needing to map a large number of Tasks onto a small number of 
threads.  Using core.thread here doesn't cut it, because core.thread 
doesn't automate passing the function's arguments to the new thread. 
Also, I figured out that some of the conditions for @safe tasks can be 
relaxed a little if they run in a dedicated thread instead of a TaskPool.

>
> But what I wanted to say is, even if it may be difficult to implement
> such thread caching now, putting means to execute a Task in its own
> thread now into the ThreadPool allows for such an optimization later (it
> could even exist while still keeping Task.executeInNewThread()).

I can't really comment because I still don't understand this very well.


More information about the Digitalmars-d mailing list