2012-08-15 27 views
5

Theo như tôi hiểu hàng đợi GCD không phải hàng đợi chính, chúng được nối tiếp theo mặc định chỉ trên các thiết bị có CPU đơn lõi. Nhưng nếu một thiết bị có nhiều lõi, nó có thể xảy ra các khối trong hàng đợi được thực hiện đồng thời.Làm thế nào để tạo một hàng đợi GCD luôn luôn nối tiếp, ngay cả trên các CPU đa lõi?

Tôi muốn sử dụng hàng đợi GCD nối tiếp để khắc phục một số sự cố đồng thời và hàng đợi này phải được nối tiếp ngay cả khi có nhiều lõi.

Nhà phát triển đã đề cập đến điều này là có thể bằng cách nào đó. Làm thế nào tôi sẽ tạo ra một hàng đợi luôn luôn nối tiếp?

+0

trả lời tại http://stackoverflow.com/questions/5026043/concurrency-and-serial-queues-in -grand-central-dispatch. Sử dụng dispatch_sync trên hàng đợi GCD của bạn – CSmith

+2

@CSmith Nope. Đó là đồng bộ, không phải nối tiếp. Nếu bạn có tác vụ không đồng bộ trong hàng đợi, nó có thể chạy cùng lúc với khối đồng bộ hóa của bạn. –

+0

@CSmith cũng vậy, nếu hàng đợi được đề cập là hàng đợi đồng thời toàn cầu, dispatch_sync tương đương với dispatch_async, do đó sẽ không hoạt động ở đó. – jkh

Trả lời

9

Hàng đợi GCD chuẩn có thể nhận được với hàm dispatch_get_global_queue đồng thời thực sự.

Nhưng bạn có thể tạo hàng đợi gcd tùy chỉnh bằng cách sử dụng chức năng dispatch_queue_create. Vượt qua DISPATCH_QUEUE_SERIAL làm tham số thứ hai để tạo hàng đợi đó làm nối tiếp.

+1

Có thể DISPATCH_QUEUE_SERIAL sau đó được nối tiếp cho dù có bao nhiêu lõi CPU không? Tôi lo lắng nó có thể được nối tiếp trên cơ sở mỗi lõi nhưng không hoàn toàn. Làm thế nào chắc chắn là bạn đây là lừa? –

+0

@InternationalFrog, đảm bảo rằng các tác vụ được thực hiện cái khác là mục đích chính của hàng đợi nối tiếp vì vậy tôi nghĩ bạn nên ổn định bất kể số lõi. – Vladimir

+2

@InternationalFrog - Có, hàng đợi nối tiếp mà bạn tạo bằng cách sử dụng 'dispatch_queue_create()' được đảm bảo nối tiếp trong thực thi, bất kể số lõi. Các khối trong chúng có thể chạy trên các chủ đề khác nhau, nhưng chúng sẽ luôn luôn thực thi một luồng tại một thời điểm. Tôi sử dụng điều này cho khóa không tốn kém xung quanh tài nguyên được chia sẻ ở một vài nơi. –

6

Để tạo hàng đợi đồng thời:
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.aj.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);

Để tạo hàng đợi nối tiếp:
dispatch_queue_t serialQueue = dispatch_queue_create("com.aj.serial.queue", DISPATCH_QUEUE_SERIAL);

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