2013-04-08 19 views
5

Tôi nghĩ rằng cách tốt nhất để hỏi câu hỏi này là với một số mã:Hành vi nào được đảm bảo với Grand Central Dispatch trong Objective-C?

//Main method 
for(int i = 0; i < 10; i++) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self foo:i]; 
    }); 

} 

- (void) foo: (int) i 
{ 
    @synchronized(self) 
    { 
     NSLog(@"%d",i); 
    } 
} 

Trong trường hợp này, là nó đảm bảo rằng những con số 0-9 sẽ được in ra theo thứ tự? Có bao giờ một cơ hội mà một trong những chủ đề đang chờ đợi trên hàng đợi chạy, sẽ bị bỏ qua? Làm thế nào về trong thực tế. Thực tế, điều đó có bao giờ xảy ra không? Điều gì sẽ xảy ra nếu tôi muốn hành vi trên (vẫn sử dụng chủ đề); làm thế nào tôi có thể thực hiện điều này?

+0

Chủ đề và khối GCD không bị "bỏ qua". Nếu một thread ném một ngoại lệ, bạn sẽ không bao giờ biết nếu không có một thử thách rõ ràng bởi vì GCD tha thứ xử lý ngoại lệ. – CodaFi

Trả lời

15

Trong trường hợp này, có đảm bảo rằng các số 0-9 sẽ được in không theo thứ tự?

số

Có bao giờ một cơ hội mà một trong những chủ đề được chờ đợi trên đường chạy trốn đợi , sẽ được bỏ qua?

Không rõ nội dung "bỏ qua" nghĩa là gì. Nếu nó có nghĩa là "các khối sẽ được thực hiện theo thứ tự?" câu trả lời là "có thể, nhưng nó là một chi tiết thực hiện".

Thực tế thì thế nào. Thực tế, điều đó có bao giờ xảy ra không?

Không có liên quan. Nếu bạn đang viết mã tương tranh dựa trên các giả định về chi tiết thực hiện thực tế, bạn đang viết mã đồng thời không chính xác.

Điều gì sẽ xảy ra nếu tôi muốn hành vi trên (vẫn sử dụng chủ đề); làm thế nào tôi có thể thực hiện việc này?

Tạo hàng đợi công văn nối tiếp và gửi đến hàng đợi đó theo thứ tự bạn cần thực hiện mọi thứ. Lưu ý rằng điều này là nhanh hơn đáng kể so với @synchronized() (tất nhiên, @synchronized() sẽ không hoạt động cho bạn dù sao ở chỗ nó không đảm bảo trật tự, nhưng chỉ đơn thuần là độc quyền).

+0

Bạn có thể giải thích, tại sao không? Từ tài liệu của Apple: "Hàng đợi đồng thời (còn được gọi là một loại hàng đợi công văn toàn cục) thực hiện một hoặc nhiều tác vụ đồng thời, nhưng nhiệm vụ vẫn được bắt đầu theo thứ tự mà chúng được thêm vào hàng đợi." Điều này không có nghĩa là, trật tự sẽ được đáp ứng? –

+7

Chúng sẽ được bắt đầu theo thứ tự chúng được thêm vào, nhưng việc lập lịch trình chuỗi có thể có nghĩa là chúng không hoàn thành việc thực thi theo cùng thứ tự đó. –

+0

đã nhận được, cảm ơn! –

0

Từ các tài liệu của dispatch_get_global_queue

Blocks nộp cho các hàng đợi đồng thời toàn cầu có thể được thực hiện đồng thời tôn trọng lẫn nhau với.

Điều đó có nghĩa là không có gì đảm bảo ở đó. Bạn đang đi qua một khối mã vào hàng đợi và hàng đợi lấy nó từ đó.

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