在CGD中快速实现多线程的并发控制

转自博客:http://www.tanhao.me/pieces/392.html
自从ios4.0/mac osx10.6引入了GCD之后,让我们在使用多线程的时候确实方便了很多,关于GCD的一些介绍和使用本站中已经转过一位资深开发者的几篇系列文章,非常彻底的介绍了GCD的用法和一些特性,有兴趣的朋友可以去翻阅。

但当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用

NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是

dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。

在GCD中有三个函数是semaphore的操作,分别是:

  • dispatch_semaphore_create          创建一个semaphore
  • dispatch_semaphore_signal          发送一个信号
  • dispatch_semaphore_wait              等待信号

简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制。

 dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i = 0; i < 100; i++)
    {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%i",i);
            sleep(2);
            dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_release(group);
    dispatch_release(semaphore);

简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如上就是一个并发数为10的一个线程队列。

我已经根据GCD,封装了一个简单的THOperationQueue,作为THWebService框架中的一个功能,

THWebService

THWebService是一个轻量级的网络访问管理类,对NSURLConnection进行封装,提供了get、post网络请求以及提供了文件的断点下载的简单接口(同步、异步、block)。另外将网络请求中常用的HASH算法、HMAC等算法的封装,如果你开发的软件经常与网络访问,或许这些代码将会为你带来不少的便利。

注:代码采用ARC。

1.1版本
添加了THDispatchQueue,GCD实现的一个多线程并发控制的队列。
添加了THWebDataCache,非常简单的缓存组件。

1.0版本:
1.对get、post(文件上传)、文件下载的接口的封装;
2.支持同步、异步、block三种调用方式;
3.对常用HASH及HMac算法的封装(支持对Data和文件两种方式)。

源码下载:https://github.com/Jereminx/THWebService

posted @ 2013-01-30 20:57  Jere-Jobs  阅读(204)  评论(0编辑  收藏  举报