多线程(一)
2016-05-06 19:37
375 查看
这节主要是信号量和组队列的学习研究。
对于这两种线程方法,我打个过独木桥的比方,如果我们前面的人没有通过这个唯一的独木桥,那么我们也无法通过这座桥,也就是说不管前面的人走多慢,我们只有等前面的人通过之后,我们才能紧随其后过桥。
一、信号量
信号量是一个整形并且具有一个初始计数值,支持两个操作:信号通知和等待。当一个信号量被信号通知是,其计数会被增加,当一个线程在一个信号量上等待时,线程就会被阻塞。直到计数器大于零,线程才会减少这个计数。
[objc] viewplain copy
+ (void)thread_semaphore{
//dispatch_semaphore 信号量基于计数器的一种多线程同步机制,在多线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题
int data = 3;
int mainData = 0;
//创建信号量,可以设置信号量的资源数,0表示没有资源,调用dispatch_semaphore_wait会立即等待
dispatch_semaphore_t sem = dispatch_semaphore_create(0);//整形的参数,可以理解为信号的总量
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
int sum = 0;
for(int i = 0; i < 5; i++)
{
sum += data;
NSLog(@" >> Sum: %d", sum);
}
//通知信号,如果等待线程被唤醒则返回非0,否侧返回0
dispatch_semaphore_signal(sem);//发送一个信号,信号量+1
});
//等待信号,可以设置超时参数,该函数返回0表示得到通知,非0表示超时
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);//等待信号,当信号总量小于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,
//通过信号量就可以保证,Main Data永远在Sum之后执行
for(int j=0;j<5;j++)
{
mainData++;
NSLog(@">> Main Data: %d",mainData);
}
}
结果如我们所料,执行顺序按部就班。
二、 组队列。
顾名思义,分组执行操作,最终汇总,有点儿百川终到海的意思。
[objc] viewplain copy
+ (void)thread_group{
// 合并汇总结果, 并行的线程不分先后
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
// 并行执行的线程一
for (int i = 0; i < 10; i ++) {
NSLog(@"一%d",i);
}
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
for (int i = 0; i < 5; i ++) {
NSLog(@"二%d",i);
}
// 并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 上面并行线程结束后调用,汇总结果,
NSLog(@"上面的结果全部输出完毕");
});
}
运行结果如下,可以发现并发线程没有先后之分,随机输出。
相关文章推荐
- 5、jQuery的Ajax与Java通过GET方式交互
- hdu3416 判断最短路是否唯一(每条边只能走一次)
- 直接插入排序
- 一箭穿心
- code2198 数字三角形WWW
- 值得推荐的C/C++框架和库
- 重写父类的方法
- Android填坑系列:在小米系列等机型上放开定位权限后的定位请求弹框
- nctf-/x00
- Android03-Activity生命周期及启动模式
- mybatis.net 多表联查
- 折戟沉沙铁已销
- shell常用命令之curl: -w,–write-out参数详解
- 某银行MIS项目运维札记
- codeforces 580D Kefa and Dishes【状态压缩+dp】
- 解决在ide数据库中用户名root 密码root 而在自己mysql上密码输入root连不上的问题
- UDP socket
- java 异常等基础知识
- 编程,编的不仅是程
- 前端-JS-this