{"id":1435,"date":"2018-11-27T21:54:43","date_gmt":"2018-11-27T13:54:43","guid":{"rendered":"http:\/\/www.yusian.com\/blog\/?p=1435"},"modified":"2020-12-01T12:45:00","modified_gmt":"2020-12-01T04:45:00","slug":"gcd%e5%90%8c%e6%ad%a5%e4%bb%bb%e5%8a%a1%e5%ae%9e%e7%8e%b0%e5%8a%a0%e9%94%81%e6%95%88%e6%9e%9c","status":"publish","type":"post","link":"https:\/\/www.yusian.com\/blog\/project\/2018\/11\/27\/2154431435.html","title":{"rendered":"GCD\u540c\u6b65\u4efb\u52a1\u5b9e\u73b0\u52a0\u9501\u6548\u679c"},"content":{"rendered":"<p><strong>1\u3001DISPATCH_QUEUE_SERIAL<\/strong><br \/>\n1.1\u3001\u4e32\u884c\u961f\u5217\u4f7f\u961f\u5217\u4e2d\u7684\u4efb\u52a1\u540c\u6b65\u6267\u884c\uff0c\u5355\u6b21\u53ea\u80fd\u6267\u884c\u4e00\u4e2a\u4efb\u52a1<br \/>\n1.2\u3001\u793a\u4f8b\u4ee3\u7801<\/p>\n<pre lang=\"objc\" line=\"1\">#import \"ViewController.h\"\r\n#import <pthread.h>\r\n@implementation ViewController\r\nstatic NSUInteger ticketCount_ = 20;\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    dispatch_queue_t queue = dispatch_queue_create(\"com.yusian.custom-queue\", DISPATCH_QUEUE_SERIAL);\r\n    for (int i = 0; i < 5; i++) {\r\n        dispatch_async(queue, ^{\r\n            [self saleTicket];\r\n        });\r\n    }\r\n}\r\n- (void)saleTicket\r\n{\r\n    NSUInteger remain = ticketCount_;\r\n    sleep(1);\r\n    ticketCount_ = --remain;\r\n    NSLog(@\"%ld, %@\", ticketCount_, [NSThread currentThread]);\r\n}\r\n@end<\/pre>\n<p>\u6267\u884c\u7ed3\u679c\uff1a<!--more--><\/p>\n<pre lang=\"mach\">2018-11-27 21:45:13.668026+0800 MultiThread[1652:65435] 19, <NSThread: 0x60000349d340>{number = 3, name = (null)}\r\n2018-11-27 21:45:14.670487+0800 MultiThread[1652:65435] 18, <NSThread: 0x60000349d340>{number = 3, name = (null)}\r\n2018-11-27 21:45:15.674636+0800 MultiThread[1652:65435] 17, <NSThread: 0x60000349d340>{number = 3, name = (null)}\r\n2018-11-27 21:45:16.678230+0800 MultiThread[1652:65435] 16, <NSThread: 0x60000349d340>{number = 3, name = (null)}\r\n2018-11-27 21:45:17.683553+0800 MultiThread[1652:65435] 15, <NSThread: 0x60000349d340>{number = 3, name = (null)}<\/pre>\n<p><strong>2\u3001dispatch_semaphore<\/strong><br \/>\n2.1\u3001dispatch_semaphore(dispatch:\u6d3e\u9063\u3001\u8c03\u5ea6\uff0csemaphore\uff1a\u4fe1\u53f7\u91cf)<br \/>\n2.2\u3001dispatch_semaphore\u7684\u4f5c\u7528\u662f\u9650\u5236gcd\u7684\u6700\u5927\u5e76\u53d1\u91cf\uff0c\u5982\u679c\u4e3a1\u5219\u7c7b\u4f3c\u540c\u6b65\u6548\u679c<br \/>\n2.3\u3001\u793a\u4f8b\u4ee3\u7801<\/p>\n<pre lang=\"objc\" line=\"1\">#import \"ViewController.h\"\r\n#import <pthread.h>\r\n@interface ViewController()\r\n{\r\n    dispatch_semaphore_t    _semaphore;\r\n}\r\n@end\r\n@implementation ViewController\r\nstatic NSUInteger ticketCount_ = 20;\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    \/\/ \u5982\u679c\u53c2\u6570\u4e3a5\u5219\u540c\u65f6\u6267\u884c5\u6761\u7ebf\u7a0b\uff0c\u5982\u679c\u4e3a1\uff0c\u5219\u6bcf\u6b21\u53ea\u6709\u4e00\u6761\u7ebf\u7a0b\r\n    _semaphore = dispatch_semaphore_create(1);\r\n    for (int i = 0; i < 10; i++) {\r\n        dispatch_async(dispatch_get_global_queue(0, 0), ^{\r\n            [self saleTicket];\r\n        });\r\n    }\r\n}\r\n- (void)saleTicket\r\n{\r\n    \/\/ \u7b2c\u4e8c\u4e2a\u53c2\u6570\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u8d85\u8fc7\u8d85\u65f6\u65f6\u95f4\u5219\u76f4\u63a5\u6267\u884c\uff0c\u4e0d\u518d\u7b49\u5f85\uff0cDISPATCH_TIME_FOREVER\u4e3a\u4e00\u76f4\u7b49\u5f85\r\n    dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);\r\n    NSUInteger remain = ticketCount_;\r\n    sleep(1);\r\n    ticketCount_ = --remain;\r\n    NSLog(@\"%ld\", ticketCount_);\r\n    \/\/ \u6267\u884c\u7ed3\u675f\u540e\u53d1\u9001\u4fe1\u53f7\u91ca\u653e\u7ebf\u7a0b\u5360\u7528\r\n    dispatch_semaphore_signal(_semaphore);\r\n}\r\n@end<\/pre>\n<p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<pre lang=\"mach\">2018-11-27 21:14:58.762370+0800 MultiThread[1269:34401] 19\r\n2018-11-27 21:14:59.766374+0800 MultiThread[1269:34404] 18\r\n2018-11-27 21:15:00.770787+0800 MultiThread[1269:34402] 17\r\n2018-11-27 21:15:01.771741+0800 MultiThread[1269:34403] 16\r\n2018-11-27 21:15:02.773284+0800 MultiThread[1269:34412] 15\r\n2018-11-27 21:15:03.777777+0800 MultiThread[1269:34416] 14\r\n2018-11-27 21:15:04.782864+0800 MultiThread[1269:34417] 13\r\n2018-11-27 21:15:05.787534+0800 MultiThread[1269:34418] 12\r\n2018-11-27 21:15:06.792096+0800 MultiThread[1269:34419] 11\r\n2018-11-27 21:15:07.794997+0800 MultiThread[1269:34420] 10<\/pre>\n<p><strong>3\u3001dispatch_group_notify<\/strong><br \/>\n3.1\u3001\u5982\u679c\u9700\u8981\u5148\u6267\u884cA\u3001B\uff0c\u518d\u6267\u884cC\uff0c\u8be5\u5982\u4f55\u5b9e\u73b0\uff1b<br \/>\n3.2\u3001\u5148\u5c06A\u3001B\u52a0\u5165\u5230\u4e00\u4e2a\u5e76\u884c\u961f\u5217\u7ec4dispatch_group\uff1b<br \/>\n3.3\u3001C\u901a\u8fc7dispatch_group_notify\u7b49\u5f85A\u3001B\u7ed3\u675f\u540e\u88ab\u5524\u9192\u6267\u884c<br \/>\n3.4\u3001\u793a\u4f8b\u4ee3\u7801<\/p>\n<pre lang=\"objc\" line=\"1\">#import \"ViewController.h\"\r\n#import <pthread.h>\r\n@implementation ViewController\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    dispatch_group_t group = dispatch_group_create();\r\n    dispatch_queue_t queue = dispatch_queue_create(\"queue\", DISPATCH_QUEUE_CONCURRENT);\r\n    dispatch_group_async(group, queue, ^{\r\n        [self methodA];\r\n    });\r\n    dispatch_group_async(group, queue, ^{\r\n        [self methodB];\r\n    });\r\n    \/\/ \u7b49\u5f85\u7ebf\u7a0b\u7ed3\u675f\u540e\u88ab\u5524\u9192\u6267\u884c\r\n    dispatch_group_notify(group, queue, ^{\r\n        [self methodC];\r\n    });\r\n}\r\n- (void)methodA\r\n{\r\n    NSLog(@\"---a---\");\r\n}\r\n- (void)methodB\r\n{\r\n    NSLog(@\"---b---\");\r\n    sleep(2);\r\n}\r\n- (void)methodC\r\n{\r\n    NSLog(@\"---c---\");\r\n}<\/pre>\n<p>\u6267\u884c\u7ed3\u679c\uff1a<\/p>\n<pre lang=\"mach\">\r\n2018-11-27 21:51:51.798390+0800 MultiThread[1774:73287] ---a---\r\n2018-11-27 21:51:51.798393+0800 MultiThread[1774:73288] ---b---\r\n2018-11-27 21:51:53.803127+0800 MultiThread[1774:73288] ---c---<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001DISPATCH_QUEUE_SERIAL 1.1\u3001\u4e32\u884c\u961f\u5217\u4f7f\u961f\u5217\u4e2d\u7684\u4efb\u52a1\u540c\u6b65\u6267\u884c\uff0c\u5355\u6b21\u53ea\u80fd\u6267\u884c\u4e00\u4e2a\u4efb\u52a1 1.2\u3001\u793a\u4f8b\u4ee3\u7801 #import &#8220;ViewController.h&#8221; #import @implementation ViewController static NSUInteger ticketCount_ = 20; &#8211; (void)viewDidLoad { [super viewDidLoad]; dispatch_queue_t queue = dispatch_queue_create(&#8220;com.yusian.custom-queue&#8221;, DISPATCH_QUEUE_SERIAL); for (int i = 0; i < 5; i++) { dispatch_async(queue, ^{ [self saleTicket]; }); } } - (void)saleTicket { NSUInteger remain = ticketCount_; sleep(1); ticketCount_ = --remain; NSLog(@\"%ld, %@\", ticketCount_, [NSThread [&hellip;]\n<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[88,11],"tags":[78,192,180,196],"class_list":["post-1435","post","type-post","status-publish","format-standard","hentry","category-cpp","category-project","tag-gcd","tag-192","tag-180","tag-196"],"_links":{"self":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/comments?post=1435"}],"version-history":[{"count":0,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1435\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/media?parent=1435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/categories?post=1435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/tags?post=1435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}