Computer >> Máy Tính >  >> Lập trình >> IOS

Grand Central Dispatch (GCD)

Grand Central Dispatch (GCD) - công nghệ dành cho hệ điều hành Mac OS X và iOS của Apple - là sự kết hợp của các phần mở rộng cho ngôn ngữ C, API và thư viện thời gian chạy cho phép các nhà phát triển ứng dụng xác định các phần mã để chạy trong song song. Giống như OpenMP, GCD quản lý hầu hết các chi tiết của luồng. GCD xác định các phần mở rộng cho ngôn ngữ C và C ++ được gọi là các khối. Một khối chỉ đơn giản là một đơn vị công việc khép kín. Nó được chỉ định bởi một dấu mũ ˆ được chèn vào phía trước của một cặp dấu ngoặc nhọn {}. Ví dụ đơn giản về khối được hiển thị bên dưới &trừ;

{
   ˆprintf("This is a block");
}

Nó lên lịch cho các khối để thực thi thời gian chạy bằng cách đặt chúng vào hàng đợi gửi. Khi nó loại bỏ một khối khỏi hàng đợi, nó sẽ gán khối cho một luồng có sẵn từ nhóm luồng mà nó quản lý. GCD xác định hai loại hàng đợi điều phối:nối tiếp và đồng thời. Các khối được đặt trên một hàng đợi nối tiếp được loại bỏ theo thứ tự FIFO. Khi một khối đã được xóa khỏi hàng đợi, nó phải hoàn thành việc thực thi trước khi khối khác bị xóa. Mỗi tiến trình có hàng đợi nối tiếp riêng của nó (được gọi là hàng đợi chính). Các nhà phát triển có thể tạo thêm hàng đợi nối tiếp cục bộ cho các quy trình cụ thể. Hàng đợi nối tiếp rất hữu ích để đảm bảo thực hiện tuần tự một số tác vụ. Các khối được đặt trên một hàng đợi đồng thời cũng bị xóa theo thứ tự FIFO, nhưng một số khối có thể bị xóa cùng một lúc, do đó cho phép nhiều khối thực thi song song. Có ba hàng đợi gửi đồng thời trên toàn hệ thống và chúng được phân biệt theo mức độ ưu tiên:thấp, mặc định và cao. Mức độ ưu tiên đại diện cho một sự gần đúng về tầm quan trọng tương đối của các khối. Rất đơn giản, các khối có mức độ ưu tiên cao hơn nên được đặt trên hàng đợi gửi đi có mức độ ưu tiên cao. Đoạn mã sau minh họa việc lấy hàng đợi đồng thời có mức ưu tiên mặc định và gửi một khối tới hàng đợi bằng cách sử dụng hàm gửi async () -

dispatch_queue_t queue = dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch async(queue, ˆ{ printf("This is a block."); });

Bên trong, nhóm luồng của GCD bao gồm các luồng POSIX. GCD chủ động quản lý nhóm, cho phép số lượng luồng phát triển và thu nhỏ theo nhu cầu ứng dụng và dung lượng hệ thống.