2011-07-29 30 views
27

Các mã sau đây:hành vi dispatch_get_global_queue

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i=0; i<100000; i++) { 
     NSLog(@"HIGH 1 %d", i); 
    } 
}); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    for (int i=0; i<100000; i++) { 
     NSLog(@"LOW %d", i); 
    } 
}); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    for (int i=0; i<100000; i++) { 
     NSLog(@"HIGH 2 %d", i); 
    } 
}); 

kết quả trong hỗn hợp của cao 1, cao 2 và thấp bản ghi.

Làm cách nào để in đồng thời bản ghi high1 và high2. không phải cả blog high1 và high2 trên cùng một hàng đợi? Vì vậy, không nên high1 khối kết thúc trước khi bắt đầu thực hiện khối high2?

Trả lời

22

Điều đó tùy thuộc vào máy bạn đang chạy. Tôi nghi ngờ bạn đang chạy này trên máy Mac của bạn, bởi vì GCD sẽ tự động tạo ra đủ chủ đề cho hệ thống cụ thể cho công việc trên hàng đợi toàn cầu. Vì vậy, bạn có thể có nhiều hơn một lõi, vì vậy GCD đang chạy công việc của bạn trên cả hai lõi.

Nếu bạn tạo hàng đợi của mình bằng cách sử dụng dispatch_queue_create, bạn nhận được hàng đợi nối tiếp và sau đó bạn được đảm bảo hành vi FIFO.

FWIW (mặc dù bạn không nên dựa vào hành vi này), nếu bạn chạy trên iPhone, tôi nghi ngờ bạn sẽ thấy hành vi xếp hàng nối tiếp vì iPhone của bạn là lõi đơn. Đừng dựa vào điều này mặc dù, iPad 2 là đa lõi tôi nghĩ!

EDIT:

Tài liệu cho dispatch_get_global_queue: Trả về một nổi tiếng toàn cầu đồng thời hàng đợi của một mức độ ưu tiên.

6

Bạn vừa minh họa lý do tại sao bạn không nên gọi các phương thức không an toàn trên luồng bên trong dispatch_async. Nếu có đủ lõi xử lý để thực hiện nhiều công việc hơn, GCD sẽ tiếp tục và thực hiện công việc trên chúng bất kể việc làm trước đó trong một hàng đợi đã cho có được trả lại hay không. Các hành vi tương tự có thể đạt được trong OS X 10.7 bằng cách tạo ra hàng đợi riêng của bạn với:

dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT); 

Rõ ràng NSLog() có thể được gọi là thường xuyên như bạn thích mà không lo lắng về việc lỗi truy cập xấu hoặc tương tự nhưng nếu bạn lo ngại về thread-safety hoặc thứ tự mà công việc của bạn trở lại xem xét sử dụng các nhóm công văn.

0

dispatch_get_global_queue là loại hàng đợi đồng thời. Bạn chỉ định cùng mức độ ưu tiên cho high1 và high2, kết quả là kết hợp của high1 và high2. Sau đó, nó sẽ là kết quả thấp vì nó có ưu tiên thấp hơn.