2011-12-29 42 views
7

tôi nhận được một số nghi ngờ về hành vi của mã này:dispatch_sync gọi thành một cuộc gọi dispatch_async

dispatch_async(queue, ^{ 
    sleep(2); 
    NSLog(@"step1"); 

    dispatch_sync(queue, ^{ 
     sleep(3); 
     NSLog(@"step 2"); 
    }); 

    NSLog(@"step 3"); 
}); 

Từ những hàng tôi mong đợi để có được như đầu ra step1 -> step3 -> step2 nhưng tôi có được chỉ step1.

Nếu tôi thay đổi dispatch_sync bằng dispatch_async nó hoạt động như dự kiến, dispatch_sync có thành một cuộc gọi dispatch_async tạo ra loại sự cố này không?

Chỉnh sửa sau khi câu trả lời ----------------

Trường hợp này tạo ra một bế tắc:

Bạn có thể kiểm tra câu trả lời chấp nhận để có giải thích về tình trạng này và kiểm tra liên kết này để biết tài liệu http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html

Trả lời

21

Đó là bế tắc.

Cuộc gọi dispatch_sync sẽ chờ đợi cho đến khi queue có sẵn trước khi chạy khối của nó và trở lại nhưng điều đó sẽ không có sẵn cho đến khi dispatch_async đã xong vì vậy nó sẽ chỉ ngồi đó quay chờ đợi để gọi dispatch_sync.

Các vấn đề liên quan