2012-08-12 22 views
10

Tôi đã bắt đầu kiểm soát hàng đợi lần đầu tiên và cảm thấy như tôi có một xử lý tốt về cách sử dụng chúng và kudo cho Apple để làm cho chúng khá đơn giản để sử dụng.@synchronized vs GCD dispatch_barrier_async

Tuy nhiên, những gì tôi gặp phải là thách thức của nhiều chủ đề đọc và viết cho cùng một đối tượng. Trong this question Tôi nhận được this fine answer, và nó để lại cho tôi yêu cầu một số xác nhận từ mọi người để đảm bảo rằng tôi hiểu được ưu và nhược điểm của @synchronizedGCD dispatch_barrier_async.

Đây là cách tôi nhìn thấy nó:

@synchronized 

PRO: Bạn có thể quấn bất kỳ đối tượng trong @synchronized miễn là bạn có quyền truy cập/con trỏ đến nó, làm cho nó dễ dàng cho các mô hình dữ liệu dùng chung được an toàn xử lý từ các đối tượng khác nhau trong chương trình

PRO: được hỗ trợ bởi iOS 4 (và có thể sớm hơn)

`dispatch_barrier_async` with custom DISPATCH_QUEUE_CONCURRENT 

PRO: Liệu nhanh hơn @synchronized

CON: DISPATCH_QUEUE_CONCURRENT chỉ có sẵn trong iOS 5 (như đã thảo luận here), vì vậy không có sẵn để hỗ trợ iOS 4

CON: Không dễ dàng để sử dụng khi kiểm soát đọc/ghi trên một đối tượng từ nhiều đối tượng khác, vì hàng đợi dễ dàng nhất chỉ có đối tượng tạo ra chúng (không cần phải làm việc để hạn chế giới hạn này)

Tóm lại, công cụ tốt nhất phụ thuộc vào nhu cầu của chương trình, trong việc xem xét ở trên.

Nếu có ai đó thêm hoặc chỉ ra điều gì đó, tôi đánh giá cao điều đó.

Trả lời

3

Vâng, một số điều cần chỉ ra:

1) Khi bạn sử dụng @synchronized, nó kéo trong khuôn khổ ngoại lệ WHOLE dành cho iOS (hoặc OSX) cho một ứng dụng. Tôi biết điều này trên OSX và nó có một tác động hiệu suất ở đó, không thể nói chắc chắn trên iOS nhưng sẽ mong đợi như vậy. Điều đó nói rằng, đây là sử dụng một búa tạ để lái xe trong một móng tay - khả năng đó là xung quanh cách trước khi các tùy chọn khác đã có sẵn. Cá nhân tôi tránh sử dụng nó như bệnh dịch hạch, và đã chuyển sang các khung công tác nguồn mở khác để sử dụng các semaphores (tôi cảm ơn Mike Ash (một lần nữa) cho điều đó!)

2) Nhận xét của bạn về "DISPATCH_QUEUE_CONCURRENT" - kể từ iOS 4 hệ thống đã cung cấp cho bạn 3 hàng đợi đồng thời, do đó bạn thực sự đang đẩy phong bì nếu bạn cần xác định phong bì của riêng mình. Với công văn, bạn có async và đồng bộ, nối tiếp và đồng thời, nhóm mà bạn có thể chờ đợi, gửi đi sau. Có một sự phong phú ở đây như thế nào bạn có thể nghĩ đến 1). Bạn càng sử dụng nhiều khối, bạn càng sử dụng chúng càng nhiều!

EDIT: Tôi đã sử dụng hàng đợi đồng thời tùy chỉnh trong ứng dụng iOS 4.3 của tôi, cùng với tất cả các kỹ thuật ngăn chặn Mike Ash. Hàng đợi.h tập tin cho thấy nó như có sẵn:

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) 
DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW 
dispatch_queue_t 
dispatch_get_global_queue(dispatch_queue_priority_t priority, unsigned long flags); 

/*! 
* @const DISPATCH_QUEUE_SERIAL 
* @discussion A dispatch queue that invokes blocks serially in FIFO order. 
*/ 
#define DISPATCH_QUEUE_SERIAL NULL 

/*! 
* @const DISPATCH_QUEUE_CONCURRENT 
* @discussion A dispatch queue that may invoke blocks concurrently and supports 
* barrier blocks submitted with the dispatch barrier API. 
*/ 
#define DISPATCH_QUEUE_CONCURRENT (&_dispatch_queue_attr_concurrent) 
+2

điểm của bạn 2) không áp dụng cho dispatch_barrier, vì bạn không thể sử dụng này trên một hàng đợi toàn cầu, chỉ có một hàng đợi tùy chỉnh đồng thời. Đối với việc đọc/ghi an toàn thread bằng cơ chế GCD, bạn cần một hàng đợi đồng thời tùy chỉnh. Được mô tả ở đây: http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html – johnbakers

+0

Tôi đã chỉnh sửa câu trả lời của mình - Tôi đã sử dụng kỹ thuật Mike Ash trong iOS 4.3 của mình ứng dụng để tôi biết chắc chắn các rào cản nơi có hàng đợi đồng thời. –

+0

điều này là thú vị, trong một câu hỏi khác của tôi và trên trang web của Ash là tốt, nó đã được thống nhất bởi tất cả các hàng đợi đồng thời tùy chỉnh chỉ có sẵn trong iOS 5 trở lên; bạn đang đề xuất khác. hàng đợi đồng thời toàn cầu luôn sẵn có, nhưng mọi người đều có ấn tượng rằng hàng đợi đồng thời tùy chỉnh là một bổ sung rất gần đây cho iOS (mặc dù đã có trong OS X trước đó) – johnbakers

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