|
79 | 79 |
|
80 | 80 |
|
81 | 81 |
|
82 | | -<meta name="description" content="本文主要对比了iOS多线程编程中所涉及的一些概念 进程 vs. 线程 同步 vs. 异步 串行 vs. 并发 并行 vs. 并发 任务 vs. 队列 队列 vs. 线程 同步 vs. 互斥"> |
| 82 | +<meta name="description" content="本文主要对比了iOS多线程编程中所涉及的一些概念 进程 vs. 线程 同步 vs. 异步 串行 vs. 并发 并行 vs. 并发 任务 vs. 队列 队列 vs. 线程 同步 vs. 互斥 异步 + 串行 异步 + 并发 同步 + 串行(很少使用、可能死锁) 同步 + 并发(很少使用)"> |
83 | 83 | <meta name="keywords" content="线程">
|
84 | 84 | <meta property="og:type" content="article">
|
85 | 85 | <meta property="og:title" content="多线程基础概念">
|
86 | 86 | <meta property="og:url" content="https://github.com/Richard-zhang-iOS/Richard-zhang-iOS.github.io/2018/09/18/多线程基础概念 /index.html">
|
87 | 87 | <meta property="og:site_name" content="Richard-zhang-iOS的博客">
|
88 | | -<meta property="og:description" content="本文主要对比了iOS多线程编程中所涉及的一些概念 进程 vs. 线程 同步 vs. 异步 串行 vs. 并发 并行 vs. 并发 任务 vs. 队列 队列 vs. 线程 同步 vs. 互斥"> |
| 88 | +<meta property="og:description" content="本文主要对比了iOS多线程编程中所涉及的一些概念 进程 vs. 线程 同步 vs. 异步 串行 vs. 并发 并行 vs. 并发 任务 vs. 队列 队列 vs. 线程 同步 vs. 互斥 异步 + 串行 异步 + 并发 同步 + 串行(很少使用、可能死锁) 同步 + 并发(很少使用)"> |
89 | 89 | <meta property="og:locale" content="zh-Hans">
|
90 | | -<meta property="og:updated_time" content="2018-09-18T07:49:29.490Z"> |
| 90 | +<meta property="og:updated_time" content="2018-09-18T08:17:30.261Z"> |
91 | 91 | <meta name="twitter:card" content="summary">
|
92 | 92 | <meta name="twitter:title" content="多线程基础概念">
|
93 | | -<meta name="twitter:description" content="本文主要对比了iOS多线程编程中所涉及的一些概念 进程 vs. 线程 同步 vs. 异步 串行 vs. 并发 并行 vs. 并发 任务 vs. 队列 队列 vs. 线程 同步 vs. 互斥"> |
| 93 | +<meta name="twitter:description" content="本文主要对比了iOS多线程编程中所涉及的一些概念 进程 vs. 线程 同步 vs. 异步 串行 vs. 并发 并行 vs. 并发 任务 vs. 队列 队列 vs. 线程 同步 vs. 互斥 异步 + 串行 异步 + 并发 同步 + 串行(很少使用、可能死锁) 同步 + 并发(很少使用)"> |
94 | 94 |
|
95 | 95 |
|
96 | 96 |
|
@@ -361,6 +361,10 @@ <h1 class="post-title" itemprop="name headline">多线程基础概念</h1>
|
361 | 361 | <li>任务 vs. 队列</li>
|
362 | 362 | <li>队列 vs. 线程</li>
|
363 | 363 | <li>同步 vs. 互斥</li>
|
| 364 | +<li>异步 + 串行</li> |
| 365 | +<li>异步 + 并发</li> |
| 366 | +<li>同步 + 串行(很少使用、可能死锁)</li> |
| 367 | +<li>同步 + 并发(很少使用)</li> |
364 | 368 | </ul>
|
365 | 369 | <a id="more"></a>
|
366 | 370 | <h2 id="进程-vs-线程"><a href="#进程-vs-线程" class="headerlink" title="进程 vs. 线程"></a>进程 vs. 线程</h2><ul>
|
@@ -412,6 +416,15 @@ <h2 id="同步-vs-互斥"><a href="#同步-vs-互斥" class="headerlink" title="
|
412 | 416 | <li>互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 </li>
|
413 | 417 | <li>同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。</li>
|
414 | 418 | </ul>
|
| 419 | +<h2 id="异步-串行"><a href="#异步-串行" class="headerlink" title="异步 + 串行"></a>异步 + 串行</h2><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><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">- (void)asyncSerial {</span><br><span class="line"> /* 1. 创建一个串行队列 */</span><br><span class="line"> dispatch_queue_t serialQueue = dispatch_queue_create("download.tsaievan.com", DISPATCH_QUEUE_SERIAL);</span><br><span class="line"> </span><br><span class="line"> /* 2. 将不同的任务添加到队列中 */</span><br><span class="line"> dispatch_async(serialQueue, ^{</span><br><span class="line"> NSLog(@"download1--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> dispatch_async(serialQueue, ^{</span><br><span class="line"> NSLog(@"download2--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> dispatch_async(serialQueue, ^{</span><br><span class="line"> NSLog(@"download3--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
| 420 | +<p>结论:开启了新的线程, 但是不管任务有多少个, 只开启一条新的线程, 任务的执行顺序也是按照队列中的顺序执行的, <strong>因为同一条线程中, 必须等到前一个任务执行完毕后, 才能执行下一个任务.</strong></p> |
| 421 | +<h2 id="异步-并发"><a href="#异步-并发" class="headerlink" title="异步 + 并发"></a>异步 + 并发</h2><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><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">- (void)asyncConcurrent {</span><br><span class="line"> </span><br><span class="line"> /* 1. 创建一个并发队列 */</span><br><span class="line"> dispatch_queue_t concurrentQueue = dispatch_queue_create("download.tsaievan.com", DISPATCH_QUEUE_CONCURRENT);</span><br><span class="line"> </span><br><span class="line"> /* 2. 将任务放到队列中, 下面的代码将三个任务放到队列中 */</span><br><span class="line"> dispatch_async(concurrentQueue, ^{</span><br><span class="line"> NSLog(@"download1-------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> dispatch_async(concurrentQueue, ^{</span><br><span class="line"> NSLog(@"download2-------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> dispatch_async(concurrentQueue, ^{</span><br><span class="line"> NSLog(@"download3-------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
| 422 | +<p>结论:开启了不同的线程, 任务完成的顺序也是随机的,但是开启的线程数量不是无限的,到了上限之后就会复用之前的线程。</p> |
| 423 | +<h2 id="同步-串行"><a href="#同步-串行" class="headerlink" title="同步 + 串行"></a>同步 + 串行</h2><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><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">- (void)syncSerial {</span><br><span class="line"> /* 1. 创建串行队列 */</span><br><span class="line"> dispatch_queue_t serialQueue = dispatch_queue_create("download.tsaievan.com", DISPATCH_QUEUE_SERIAL);</span><br><span class="line"> </span><br><span class="line"> /* 2. 将任务放到队列中 */</span><br><span class="line"> dispatch_sync(serialQueue, ^{</span><br><span class="line"> NSLog(@"download1--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> dispatch_sync(serialQueue, ^{</span><br><span class="line"> NSLog(@"download2--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> dispatch_sync(serialQueue, ^{</span><br><span class="line"> NSLog(@"download3--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
| 424 | +<p>结论:没有开启新线程,会阻塞当前线程,按照添加到队列的顺序执行。如果是当前线程同步到当前线程会造成死锁。</p> |
| 425 | +<p>相当于方法A调用了方法B执行,方法B执行时发现需要等待方法A执行结束才能执行,所以会造成A等待B,B等待A的死循环情况。</p> |
| 426 | +<h2 id="同步-并发"><a href="#同步-并发" class="headerlink" title="同步 + 并发"></a>同步 + 并发</h2><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><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">- (void)syncConcurrent {</span><br><span class="line"> </span><br><span class="line"> /* 1. 创建一条并发队列 */</span><br><span class="line"> dispatch_queue_t concurrentQueue = dispatch_queue_create("download.tsaievan.com", DISPATCH_QUEUE_CONCURRENT);</span><br><span class="line"> </span><br><span class="line"> /* 2. 把任务放到队列中 */</span><br><span class="line"> dispatch_sync(concurrentQueue, ^{</span><br><span class="line"> NSLog(@"download1--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> dispatch_sync(concurrentQueue, ^{</span><br><span class="line"> NSLog(@"download1--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line"> dispatch_sync(concurrentQueue, ^{</span><br><span class="line"> NSLog(@"download1--------%@",[NSThread currentThread]);</span><br><span class="line"> });</span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
| 427 | +<p>结论:没有开启新线程,会阻塞当前线程,执行顺序按照添加到队列的顺序执行。</p> |
415 | 428 |
|
416 | 429 |
|
417 | 430 | </div>
|
@@ -602,7 +615,7 @@ <h2 id="同步-vs-互斥"><a href="#同步-vs-互斥" class="headerlink" title="
|
602 | 615 |
|
603 | 616 |
|
604 | 617 |
|
605 | | - <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#进程-vs-线程"><span class="nav-number">1.</span> <span class="nav-text">进程 vs. 线程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#同步-vs-异步"><span class="nav-number">2.</span> <span class="nav-text">同步 vs. 异步</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#另外-还有一点需要明确的是"><span class="nav-number">2.0.0.1.</span> <span class="nav-text">另外, 还有一点需要明确的是</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#串行-vs-并发"><span class="nav-number">3.</span> <span class="nav-text">串行 vs. 并发</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#并行-vs-并发"><span class="nav-number">4.</span> <span class="nav-text">并行 vs. 并发</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#任务-vs-队列"><span class="nav-number">5.</span> <span class="nav-text">任务 vs. 队列</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#队列-vs-线程"><span class="nav-number">6.</span> <span class="nav-text">队列 vs. 线程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#同步-vs-互斥"><span class="nav-number">7.</span> <span class="nav-text">同步 vs. 互斥</span></a></li></ol></div> |
| 618 | + <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#进程-vs-线程"><span class="nav-number">1.</span> <span class="nav-text">进程 vs. 线程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#同步-vs-异步"><span class="nav-number">2.</span> <span class="nav-text">同步 vs. 异步</span></a><ol class="nav-child"><li class="nav-item nav-level-5"><a class="nav-link" href="#另外-还有一点需要明确的是"><span class="nav-number">2.0.0.1.</span> <span class="nav-text">另外, 还有一点需要明确的是</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#串行-vs-并发"><span class="nav-number">3.</span> <span class="nav-text">串行 vs. 并发</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#并行-vs-并发"><span class="nav-number">4.</span> <span class="nav-text">并行 vs. 并发</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#任务-vs-队列"><span class="nav-number">5.</span> <span class="nav-text">任务 vs. 队列</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#队列-vs-线程"><span class="nav-number">6.</span> <span class="nav-text">队列 vs. 线程</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#同步-vs-互斥"><span class="nav-number">7.</span> <span class="nav-text">同步 vs. 互斥</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#异步-串行"><span class="nav-number">8.</span> <span class="nav-text">异步 + 串行</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#异步-并发"><span class="nav-number">9.</span> <span class="nav-text">异步 + 并发</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#同步-串行"><span class="nav-number">10.</span> <span class="nav-text">同步 + 串行</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#同步-并发"><span class="nav-number">11.</span> <span class="nav-text">同步 + 并发</span></a></li></ol></div> |
606 | 619 |
|
607 | 620 |
|
608 | 621 | </div>
|
|
0 commit comments