{"id":1418,"date":"2018-11-26T16:48:25","date_gmt":"2018-11-26T08:48:25","guid":{"rendered":"http:\/\/www.yusian.com\/blog\/?p=1418"},"modified":"2020-12-01T12:45:11","modified_gmt":"2020-12-01T04:45:11","slug":"ios%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b8%ad%e7%9a%84%e5%87%a0%e7%a7%8d%e5%8a%a0%e9%94%81%e7%b1%bb%e5%9e%8bosspinlock%e3%80%81os_unfair_lock%e3%80%81pthread_mutex","status":"publish","type":"post","link":"https:\/\/www.yusian.com\/blog\/project\/2018\/11\/26\/1648251418.html","title":{"rendered":"iOS\u591a\u7ebf\u7a0b\u4e2d\u7684\u51e0\u79cd\u52a0\u9501\u7c7b\u578bOSSpinLock\u3001os_unfair_lock\u3001pthread_mutex"},"content":{"rendered":"<p><strong>1\u3001\u57fa\u672c\u4ecb\u7ecd<\/strong><br \/>\n1.1\u3001OSSpinLock<br \/>\n1.1.1\u3001\u81ea\u65cb\u9501\uff0ciOS10\u53ca\u4ee5\u540e\u7248\u672c\u5df2\u6807\u8bb0\u8fc7\u671f\uff1b<br \/>\n1.1.2\u3001\u9501\u5b9a\u72b6\u6001\u4e0b\uff0c\u5176\u4ed6\u7ebf\u7a0b\u8bbf\u95ee\u65f6\u5904\u4e8e\u5fd9\u7b49\u72b6\u6001<br \/>\n1.1.3\u3001\u5b58\u5728\u4f18\u5148\u7ea7\u53cd\u8f6c\u7684\u95ee\u9898\u800c\u88ab\u653e\u5f03\uff1b<br \/>\n1.2\u3001os_unfair_lock<br \/>\n1.2.1\u3001\u4e92\u65a5\u9501<br \/>\n1.2.2\u3001\u9501\u5b9a\u72b6\u6001\u4e0b\uff0c\u5176\u4ed6\u7ebf\u7a0b\u8bbf\u95ee\u65f6\u4f1a\u5904\u4e8e\u4f11\u7720\u72b6\u6001<br \/>\n1.3\u3001pthread_mutex<br \/>\n1.3.1\u3001\u4e92\u65a5\u9501<br \/>\n1.3.2\u3001\u53ef\u8de8\u5e73\u53f0\u4f7f\u7528<\/p>\n<p><strong>2\u3001\u4ee3\u7801\u5b9e\u73b0<\/strong><br \/>\n2.1\u3001OSSpinLock<\/p>\n<pre lang=\"objc\" line=\"1\">#import \"ViewController.h\"\r\n#import <libkern\/OSAtomic.h>\r\n#import <os\/lock.h>\r\n#import <pthread.h>\r\n\r\n@interface ViewController ()\r\n{\r\n    NSUInteger      _ticketCount;   \/\/ \u5269\u4f59\u7968\u6570\r\n    OSSpinLock      _spinLock;      \/\/ Spin\u9501(\u81ea\u65cb\u9501)\r\n}\r\n@end\r\n\r\n@implementation ViewController\r\n\r\n- (void)viewDidLoad\r\n{\r\n    [super viewDidLoad];\r\n    \/\/ \u9501\u521d\u59cb\u5316\r\n    _spinLock = OS_SPINLOCK_INIT;\r\n    \/\/ \u540c\u65f6\u5f00\u542f\u4e24\u4e2a\u5f02\u6b65\u7ebf\u7a0b\u5bf9\u7968\u6570\u8fdb\u884c\u81ea\u51cf\r\n    _ticketCount = 20;\r\n    \/\/ \u521b\u5efa\u4e00\u4e2a\u5e76\u884c\u961f\u5217\r\n    dispatch_queue_t queue = dispatch_queue_create(\"custom-queue\", DISPATCH_QUEUE_CONCURRENT);\r\n    dispatch_async(dispatch_get_global_queue(0, 0), ^{\r\n        for (int i = 0; i < 5; i++) {\r\n            [self saleTicket];\r\n        }\r\n    });\r\n    dispatch_async(dispatch_get_global_queue(0, 0), ^{\r\n        for (int i = 0; i < 5; i++) {\r\n            [self saleTicket];\r\n        }\r\n    });\r\n}\r\n\r\n- (void)saleTicket\r\n{\r\n    \/\/ 1\u3001\u7ebf\u7a0b\u52a0\u9501\r\n    OSSpinLockLock(&#038;_spinLock);\r\n    \/\/ 2\u3001\u6267\u884c\r\n    NSUInteger remain = _ticketCount;\r\n    \/\/ 2.1\u3001\u5148\u53d6\u6570\u636e\uff0c\u4f11\u77201\u79d2\u540e\u518d\u5199\u5165\uff0c\u901a\u8fc7\u7a97\u53e3\u671f\u5236\u9020\u5199\u5165\u51b2\u7a81\r\n    sleep(1);\r\n    _ticketCount = --remain;\r\n    NSLog(@\"%ld, %@\", _ticketCount, [NSThread currentThread]);\r\n    \/\/ 3\u3001\u89e3\u9501\r\n    OSSpinLockUnlock(&#038;_spinLock);\r\n}<\/pre>\n<p><strong>\u6253\u5370\u8f93\u51fa\uff1a<\/strong><br \/>\n\u52a0\u9501\u524d\uff1a<\/p>\n<pre lang=\"lldb\">2018-11-26 16:28:44.022292+0800 MultiThread[8426:1133657] 19, <NSThread: 0x600000290400>{number = 3, name = (null)}\r\n2018-11-26 16:28:44.022322+0800 MultiThread[8426:1133656] 19, <NSThread: 0x60000029d0c0>{number = 4, name = (null)}\r\n2018-11-26 16:28:44.022581+0800 MultiThread[8426:1133657] 18, <NSThread: 0x600000290400>{number = 3, name = (null)}\r\n2018-11-26 16:28:44.022625+0800 MultiThread[8426:1133656] 18, <NSThread: 0x60000029d0c0>{number = 4, name = (null)}\r\n2018-11-26 16:28:44.022749+0800 MultiThread[8426:1133656] 16, <NSThread: 0x60000029d0c0>{number = 4, name = (null)}\r\n2018-11-26 16:28:44.022735+0800 MultiThread[8426:1133657] 17, <NSThread: 0x600000290400>{number = 3, name = (null)}\r\n2018-11-26 16:28:44.022851+0800 MultiThread[8426:1133656] 15, <NSThread: 0x60000029d0c0>{number = 4, name = (null)}\r\n2018-11-26 16:28:44.022860+0800 MultiThread[8426:1133657] 14, <NSThread: 0x600000290400>{number = 3, name = (null)}\r\n2018-11-26 16:28:44.023016+0800 MultiThread[8426:1133657] 13, <NSThread: 0x600000290400>{number = 3, name = (null)}\r\n2018-11-26 16:28:44.024139+0800 MultiThread[8426:1133656] 12, <NSThread: 0x60000029d0c0>{number = 4, name = (null)}<\/pre>\n<p>\u52a0\u9501\u540e\uff1a<\/p>\n<pre lang=\"lldb\">2018-11-26 15:43:17.603606+0800 MultiThread[6545:997594] 19, <NSThread: 0x600002e06e80>{number = 3, name = (null)}\r\n2018-11-26 15:43:17.603914+0800 MultiThread[6545:997594] 18, <NSThread: 0x600002e06e80>{number = 3, name = (null)}\r\n2018-11-26 15:43:17.604286+0800 MultiThread[6545:997594] 17, <NSThread: 0x600002e06e80>{number = 3, name = (null)}\r\n2018-11-26 15:43:17.604444+0800 MultiThread[6545:997594] 16, <NSThread: 0x600002e06e80>{number = 3, name = (null)}\r\n2018-11-26 15:43:17.604581+0800 MultiThread[6545:997594] 15, <NSThread: 0x600002e06e80>{number = 3, name = (null)}\r\n2018-11-26 15:43:17.605013+0800 MultiThread[6545:997592] 14, <NSThread: 0x600002e02cc0>{number = 4, name = (null)}\r\n2018-11-26 15:43:17.605168+0800 MultiThread[6545:997592] 13, <NSThread: 0x600002e02cc0>{number = 4, name = (null)}\r\n2018-11-26 15:43:17.605287+0800 MultiThread[6545:997592] 12, <NSThread: 0x600002e02cc0>{number = 4, name = (null)}\r\n2018-11-26 15:43:17.605406+0800 MultiThread[6545:997592] 11, <NSThread: 0x600002e02cc0>{number = 4, name = (null)}\r\n2018-11-26 15:43:17.605522+0800 MultiThread[6545:997592] 10, <NSThread: 0x600002e02cc0>{number = 4, name = (null)}<\/pre>\n<p>2.2\u3001os_unfair_lock\u3001pthread_mutex<br \/>\n2.2.1\u3001os_unfair_lock<\/p>\n<pre lang=\"objc\" line=\"1\">\/\/ 1\u3001\u521d\u59cb\u5316\r\nos_unfair_lock unfair_lock = OS_UNFAIR_LOCK_INIT;\r\n\/\/ 2\u3001\u52a0\u9501\r\nos_unfair_lock_lock(&unfair_lock);\r\n\r\n\/\/ coding.....\r\n\r\n\/\/ 3\u3001\u89e3\u9501\r\nos_unfair_lock_unlock(&unfair_lock);<\/pre>\n<p>2.2.2\u3001pthread_mutex<\/p>\n<pre lang=\"objc\" line=\"1\">\/\/ 1.1\u3001\u521d\u59cb\u5316\u9501\u5c5e\u6027\r\npthread_mutexattr_t pthread_mutexattr;\r\npthread_mutexattr_init(&pthread_mutexattr);\r\npthread_mutexattr_settype(&pthread_mutexattr, PTHREAD_MUTEX_DEFAULT);\r\n\/\/ \u9012\u5f52\u9501\r\n\/\/ pthread_mutexattr_settype(&pthread_mutexattr, PTHREAD_MUTEX_RECURSIVE);\r\n    \r\n\/\/ 1.2\u3001\u521d\u59cb\u5316\u9501\r\npthread_mutex_t pthread_mutex;\r\npthread_mutex_init(&pthread_mutex, &pthread_mutexattr);\r\npthread_mutexattr_destroy(&pthread_mutexattr);\r\n\/\/ 2\u3001\u52a0\u9501\r\npthread_mutex_lock(&pthread_mutex);\r\n\r\n\/\/ coding.....\r\n\r\n\/\/ 3\u3001\u89e3\u9501\r\npthread_mutex_unlock(&pthread_mutex);<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001\u57fa\u672c\u4ecb\u7ecd 1.1\u3001OSSpinLock 1.1.1\u3001\u81ea\u65cb\u9501\uff0ciOS10\u53ca\u4ee5\u540e\u7248\u672c\u5df2\u6807\u8bb0\u8fc7\u671f\uff1b 1.1.2\u3001\u9501\u5b9a\u72b6\u6001\u4e0b\uff0c\u5176\u4ed6\u7ebf\u7a0b\u8bbf\u95ee\u65f6\u5904\u4e8e\u5fd9\u7b49\u72b6\u6001 1.1.3\u3001\u5b58\u5728\u4f18\u5148\u7ea7\u53cd\u8f6c\u7684\u95ee\u9898\u800c\u88ab\u653e\u5f03\uff1b 1.2\u3001os_unfair_lock 1.2.1\u3001\u4e92\u65a5\u9501 1.2.2\u3001\u9501\u5b9a\u72b6\u6001\u4e0b\uff0c\u5176\u4ed6\u7ebf\u7a0b\u8bbf\u95ee\u65f6\u4f1a\u5904\u4e8e\u4f11\u7720\u72b6\u6001 1.3\u3001pthread_mutex 1.3.1\u3001\u4e92\u65a5\u9501 1.3.2\u3001\u53ef\u8de8\u5e73\u53f0\u4f7f\u7528 2\u3001\u4ee3\u7801\u5b9e\u73b0 2.1\u3001OSSpinLock #import &#8220;ViewController.h&#8221; #import #import #import @interface ViewController () { NSUInteger _ticketCount; \/\/ \u5269\u4f59\u7968\u6570 OSSpinLock _spinLock; \/\/ Spin\u9501(\u81ea\u65cb\u9501) } @end @implementation ViewController &#8211; (void)viewDidLoad { [super viewDidLoad]; \/\/ \u9501\u521d\u59cb\u5316 _spinLock = OS_SPINLOCK_INIT; \/\/ \u540c\u65f6\u5f00\u542f\u4e24\u4e2a\u5f02\u6b65\u7ebf\u7a0b\u5bf9\u7968\u6570\u8fdb\u884c\u81ea\u51cf _ticketCount = 20; \/\/ \u521b\u5efa\u4e00\u4e2a\u5e76\u884c\u961f\u5217 dispatch_queue_t queue = dispatch_queue_create(&#8220;custom-queue&#8221;, [&hellip;]<\/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":[192,180,193],"class_list":["post-1418","post","type-post","status-publish","format-standard","hentry","category-cpp","category-project","tag-192","tag-180","tag-193"],"_links":{"self":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1418","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=1418"}],"version-history":[{"count":0,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1418\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/media?parent=1418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/categories?post=1418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/tags?post=1418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}