[libdispatch-dev] libdispatch's thread model
Daniel A. Steffen
dsteffen at apple.com
Thu Jan 28 09:20:48 PST 2010
On Jan 28, 2010, at 7:07 AM, Mario Schwalbe wrote:
> 1. Let's assume someone manages to submit n jobs that block each other causing a
> deadlock on a machine having n processors. The thread pool implementation isn't able
> to execute any other jobs anymore, so the application can be considered erroneous/dead.
> The work queue implementation is still able to execute jobs waiting in the queue, so
> the application (as a whole) can still make some progress, but cannot finish either,
> because - assuming the results of those blocked jobs are important - it at some point
> has to wait for their results (dispatch_group_wait()) which will block forever as well.
>
> 2. A deadlock requires a cycle in the dependency graph. But jobs submitted that are
> still waiting in the queue, won't be executed yet, and, hence, won't be able to acquire
> any resource to prevent other jobs from executing.
not necessarily a cycle, a dependency chain longer than the size of the thread pool is sufficient:
sem1 = dispatch_semaphore_create(0);
sem2 = dispatch_semaphore_create(0);
dispatch_async(q, ^{dispatch_semaphore_wait(sem1);});
dispatch_async(q, ^{dispatch_semaphore_wait(sem2); dispatch_signal(sem1);});
dispatch_async(q, ^{dispatch_signal(sem2);});
this will deadlock if the pool size is 2 but work correctly with a larger pool (or with the workqueue implementation)
More information about the libdispatch-dev
mailing list