您的位置:首页 > 其它

多线程(一)

2016-05-06 19:37 375 查看



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

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

一、信号量

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

[objc] view
plain 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] view
plain 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(@"上面的结果全部输出完毕");

});

}

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: