多线程(一)

来源:互联网 发布:网络流行图片大全2016 编辑:程序博客网 时间:2024/05/02 08:11

这节主要是信号量和组队列的学习研究。

对于这两种线程方法,我打个过独木桥的比方,如果我们前面的人没有通过这个唯一的独木桥,那么我们也无法通过这座桥,也就是说不管前面的人走多慢,我们只有等前面的人通过之后,我们才能紧随其后过桥。

一、信号量

信号量是一个整形并且具有一个初始计数值,支持两个操作:信号通知和等待。当一个信号量被信号通知是,其计数会被增加,当一个线程在一个信号量上等待时,线程就会被阻塞。直到计数器大于零,线程才会减少这个计数。

[objc] view plain copy
  1. + (void)thread_semaphore{  
  2.       
  3.     //dispatch_semaphore 信号量基于计数器的一种多线程同步机制,在多线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题  
  4.       
  5.     int data = 3;  
  6.     int mainData = 0;  
  7.       
  8.     //创建信号量,可以设置信号量的资源数,0表示没有资源,调用dispatch_semaphore_wait会立即等待  
  9.       
  10.     dispatch_semaphore_t sem = dispatch_semaphore_create(0);//整形的参数,可以理解为信号的总量  
  11.     dispatch_queue_t queue = dispatch_queue_create("StudyBlocks"NULL);  
  12.     dispatch_async(queue, ^(void) {  
  13.         int sum = 0;  
  14.         for(int i = 0; i < 5; i++)  
  15.         {  
  16.             sum += data;  
  17.               
  18.             NSLog(@" >> Sum: %d", sum);  
  19.         }  
  20.         //通知信号,如果等待线程被唤醒则返回非0,否侧返回0  
  21.         dispatch_semaphore_signal(sem);//发送一个信号,信号量+1  
  22.     });  
  23.     //等待信号,可以设置超时参数,该函数返回0表示得到通知,非0表示超时  
  24.     dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//等待信号,当信号总量小于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,  
  25.     //通过信号量就可以保证,Main Data永远在Sum之后执行  
  26.     for(int j=0;j<5;j++)  
  27.     {  
  28.         mainData++;  
  29.         NSLog(@">> Main Data: %d",mainData);  
  30.     }  
  31.   
  32. }  


结果如我们所料,执行顺序按部就班。




二、 组队列。

顾名思义,分组执行操作,最终汇总,有点儿百川终到海的意思。

[objc] view plain copy
  1. + (void)thread_group{  
  2.     // 合并汇总结果, 并行的线程不分先后  
  3.     dispatch_group_t group = dispatch_group_create();  
  4.     dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{  
  5.         // 并行执行的线程一  
  6.         for (int i = 0; i < 10; i ++) {  
  7.              NSLog(@"一%d",i);  
  8.         }  
  9.     });  
  10.     dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{  
  11.         for (int i = 0; i < 5; i ++) {  
  12.              NSLog(@"二%d",i);  
  13.         }  
  14.         // 并行执行的线程二  
  15.     });  
  16.     dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
  17.         // 上面并行线程结束后调用,汇总结果,  
  18.         NSLog(@"上面的结果全部输出完毕");  
  19.     });  
  20. }  


运行结果如下,可以发现并发线程没有先后之分,随机输出。




    0 0
    原创粉丝点击