|
88 | 88 | <meta property="og:description" content="之前的文章我们详细介绍了iOS中使用多线程的方式,但是一直没有细致的讲解如何在多线程的情况下保证线程的安全,今天我们就介绍下iOS中多线程中保证线程安全的方式之一锁机制 在具体说这些锁之前,先来说几个概念定义:(参考维基百科) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法。 自旋锁:是用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种">
|
89 | 89 | <meta property="og:locale" content="zh-Hans">
|
90 | 90 | <meta property="og:image" content="http://cc.cocimg.com/api/uploads//20180301/1519868419367913.png">
|
91 | | -<meta property="og:updated_time" content="2018-09-21T04:06:52.143Z"> |
| 91 | +<meta property="og:updated_time" content="2018-09-21T06:08:33.889Z"> |
92 | 92 | <meta name="twitter:card" content="summary">
|
93 | 93 | <meta name="twitter:title" content="多线程之锁同步">
|
94 | 94 | <meta name="twitter:description" content="之前的文章我们详细介绍了iOS中使用多线程的方式,但是一直没有细致的讲解如何在多线程的情况下保证线程的安全,今天我们就介绍下iOS中多线程中保证线程安全的方式之一锁机制 在具体说这些锁之前,先来说几个概念定义:(参考维基百科) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法。 自旋锁:是用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种">
|
@@ -365,6 +365,7 @@ <h1 class="post-title" itemprop="name headline">多线程之锁同步</h1>
|
365 | 365 | <li><strong>条件锁:</strong>就是条件变量,当进程的某些资源要求不满足时就进入休眠,也就是锁住了。当资源被分配到了,条件锁打开,进程继续运行。</li>
|
366 | 366 | </ol>
|
367 | 367 | <p>本文主要介绍以下11种锁的使用方式,对原理性质介绍较少,针对每种锁的工作机制,大家可以自行科普。</p>
|
| 368 | +<a id="more"></a> |
368 | 369 | <ul>
|
369 | 370 | <li>互斥锁<ul>
|
370 | 371 | <li>NSLock</li>
|
@@ -397,7 +398,7 @@ <h1 class="post-title" itemprop="name headline">多线程之锁同步</h1>
|
397 | 398 | </li>
|
398 | 399 | <li>性能对比</li>
|
399 | 400 | </ul>
|
400 | | -<aid="more"></a> |
| 401 | +<!-- more --> |
401 | 402 | <h2 id="互斥锁"><a href="#互斥锁" class="headerlink" title="互斥锁"></a>互斥锁</h2><h3 id="NSLock"><a href="#NSLock" class="headerlink" title="NSLock"></a>NSLock</h3><p>NSLock:是Foundation框架中以对象形式暴露给开发者的一种锁,(Foundation框架同时提供了NSConditionLock,NSRecursiveLock,NSCondition)NSLock定义如下:</p>
|
402 | 403 | <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">@protocol NSLocking</span><br><span class="line">- (void)lock;</span><br><span class="line">- (void)unlock;</span><br><span class="line">@end</span><br><span class="line">@interface NSLock : NSObject {</span><br><span class="line">@private</span><br><span class="line"> void *_priv;</span><br><span class="line">}</span><br><span class="line">- (BOOL)tryLock;</span><br><span class="line">- (BOOL)lockBeforeDate:(NSDate *)limit;</span><br><span class="line">@property (nullable, copy) NSString *name API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));</span><br><span class="line">@end</span><br></pre></td></tr></table></figure>
|
403 | 404 | <p>tryLock 和 lock 方法都会请求加锁,唯一不同的是trylock在没有获得锁的时候可以继续做一些任务和处理。lockBeforeDate方法也比较简单,就是在limit时间点之前获得锁,没有拿到返回NO。</p>
|
|
0 commit comments