Quite interesting. I tested the following simple code with Xcode 5.1.1 on OS X 10.9.4.
#include <dispatch/dispatch.h> int main() { { dispatch_group_t group = dispatch_group_create(); dispatch_group_enter(group); //dispatch_group_leave(group); } return 0; }
Objective-C code compiled with ARC.
$ clang -O0 -g -fobjc-arc am
The program is running.
$ ./a.out illegal hardware instruction ./a.out
The program was broken. If dispatch_group_leave (group) was called (input and output are all balloted), there are no exceptions at all. Got accident details using lldb.
$ lldb a.out Current executable set to 'a.out' (x86_64). (lldb) run Process 73482 launched: 'a.out' (x86_64) Process 73482 stopped * thread
An exception occurred in _dispatch_semaphore_dispose. We are happy to read the libdispatch source code on the Apple OpenSource website. Take a look at http://opensource.apple.com/source/libdispatch/libdispatch-339.92.1/src/semaphore.c
void _dispatch_semaphore_dispose(dispatch_object_t dou) { dispatch_semaphore_t dsema = dou._dsema; if (dsema->dsema_value < dsema->dsema_orig) { DISPATCH_CLIENT_CRASH( "Semaphore/group object deallocated while in use"); }
According to this source code, dispatch_group uses dispatch_semaphore. And dispatch_semaphore causes a signal / wait.
dispatch_semaphore_create:
CAVEATS Unbalanced dispatch semaphores cannot be released. For a given sema- phore, calls to dispatch_semaphore_signal() and dispatch_semaphore_wait() must be balanced before dispatch_release() is called on it.
Thus, the calls to dispatch_group_enter and dispatch_group_leave must also be balanced.
source share