2014-08-24

dispatch_group_enterとdispatch_group_leaveの呼び出し回数が揃ってないとクラッシュ?

dispatch_group_enterとdispatch_group_leaveの呼び出し回数が揃ってないとクラッシュするという、えー、それホント?的な質問がstack overflowに上がってました。

Why is it necessary to call dispatch_group_leave the same number of times as dispatch_group_enter?

こんなコードを試してみると、実際クラッシュ (要ARC)。

/* test.m */
#include <dispatch/dispatch.h>

int main()
{
    {
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_enter(group);
        //dispatch_group_leave(group);
    }
    return 0;
}

dispatch_groupはdispatch_semaphore使ってて、dispatch_semaphoreはsignalとwaitの呼び出し回数が揃ってない状態でdispatch_releaseするのは禁止(実装上そーなってて強制クラッシュされる)。てな感じでした。