多线程: 事实上,同一时间内单核的CPU只能执行一个线程,多线程是CPU快速的在多个线程之间进行切换,造成了多个线程同时执行的假象。如果是多核CPU就真的可以同时处理多个线程。多线程的目的是为了同步完成多项任务,提高系统的资源利用率来提高系统的效率。
默认情况下,主线程占用1M,子线程占用512KB。线程越多,CPU在调度线程上的开销越大,会降低程序的性能。
多个任务异步执行完后执行下一步
使用组:dispatch_group_t。
多任务执行前先dispatch_group_enter,任务执行完再dispatch_group_leave。enter和leave需成对使用。最后调用dispatch_group_notify。
使用信号量:dispatch_semaphore。在for循环外面调用dispatch_semaphore_wait阻塞当前线程,semaphore信号量=-1。for循环完成之后调用dispatch_semaphore_signal,semaphore信号量=0,执行下一步。
基于计数器的一种多线程同步机制。如果semaphore计数大于等于0,计数-1,返回,程序正常运行。如果计数小于0,则等待。
dispatch_semaphore_create:创建一个 Semaphore 并初始化信号的总量
dispatch_semaphore_signal:发送一个信号,让信号总量加 1
dispatch_semaphore_wait:可以使总信号量减 1,信号总量小于 0 时就会一直等待(阻塞所在线程),否则就可以正常执行。
使用栅栏方法 dispatch_barrier_async。先调用栅栏方法之前追加到并发队列的子线程任务,任务完成之后,调用dispatch_barrier_async中的任务,最后执行并发队列的剩余任务。dispatch_barrier_async起到隔断作用。
多任务按顺序执行完后执行下一步。
在for 循环里面调用dispatch_semaphore_wait。在每次循环中阻塞线程,所以每次等待当前线程执行完成之后,再进行下一次循环。
实际上,dispatch_semaphore能完成很多事情,比如线程同步(将异步执行任务转换为同步执行任务)、线程安全。dispatch_semaphore_wait可以看作线程锁。