多线程

let queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL)

   NSLog("之前 - %@", NSThread.currentThread())

    dispatch_async(queue, { () -> Void in //1
        NSLog("sync之前 - %@", NSThread.currentThread())
        dispatch_sync(queue, { () -> Void in //2
             NSLog("sync - %@", NSThread.currentThread()) // 无法输出 线程已卡死
        })
        NSLog("sync之后 - %@", NSThread.currentThread()) // 无法输出 线程已卡死
   })

  NSLog("之后 - %@", NSThread.currentThread())

输出为:

2015-07-30 02:06:51.058 test[33329:8793087] 之前 - <NSThread: 0x7fe32050dbb0>{number = 1, name = main}
2015-07-30 02:06:51.059 test[33329:8793356] sync之前 - <NSThread: 0x7fe32062e9f0>{number = 2, name = (null)}
2015-07-30 02:06:51.059 test[33329:8793087] 之后 - <NSThread: 0x7fe32050dbb0>{number = 1, name = main}

 

很明显 sync - %@sync之后 - %@ 没有被打印出来!这是为什么呢?我们再来分析一下
 
因为 注释2 这里分配的是同步队列 所以会在当前任务执行完成后执行 否则无法执行其它任务 
但是 当前任务包含了 sync 任务本身 
所以这里就会发生一个 死锁现象了 所以sync所在的线程就被卡死了 ( 如果是主线程发生这种情况 程序就崩溃了  --博主推测 还没有验证过)
 
 

NOTE:大家可能发现了一个问题,为什么我在 Swift 里打印输出使用 NSLog() 而不是 println() 呢?原因是使用 print() / println() 输出的话,它会简单地使用 流(stream) 的概念,学过 C++ 的都知道。它会把需要输出的每个字符一个一个的输出到控制台。普通使用并没有问题,可是当多线程同步输出的时候问题就来了,由于很多 println() 同时打印,就会导致控制台上的字符混乱的堆在一起,而NSLog() 就没有这个问题。到底是什么样子的呢?你可以把上面 NSLog() 改为 println() ,然后一试便知。
posted @ 2016-03-14 10:44  baaingSheep  阅读(162)  评论(0编辑  收藏  举报