dispatch_semaphore 信号量基于计数器的一种多线程同步机制。在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题。

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
    NSMutableArray *array = [NSMutableArrayarray];
    for (int index = 0; index < 100000; index++) {
        dispatch_async(queue, ^(){
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//
            NSLog(@"addd :%d", index);
            [array addObject:[NSNumber numberWithInt:index]];
            dispatch_semaphore_signal(semaphore);
        });
    }

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 如果semaphore计数大于等于1.计数-1,返回,程序继续运行。如果计数为0,则等待。这里设置的等待时间是一直等待。dispatch_semaphore_signal(semaphore);计数+1.在这两句代码中间的执行代码,每次只会允许一个线程进入,这样就有效的保证了在多线程环境下,只能有一个线程进入。

最新文章

  1. Java 中的值传递和参数传递
  2. ubuntu 跟xshell的问题
  3. iOS开发——UI基础-Xcode资源拷贝
  4. matlab矩阵合并及相关运算
  5. RHEL6解决无法使用YUM源问题
  6. android studio 智能提示忽略大小写
  7. [技术翻译] 构建现代化的Objective-C (下)
  8. 怎样在loop中处理异常
  9. 戏说HTML5(转)
  10. Delete 和 Put 请求失效, Spring 框架
  11. [C++ Primer Plus] 第5章、循环和关系表达式(一)程序清单——指针自加减优先级
  12. 使用Chrome开发者工具调试Android端内网页(微信,QQ,UC,App内嵌页等)
  13. Java8中的HashMap分析
  14. 【BZOJ4822】[CQOI2017]老C的任务(扫描线)
  15. day2(基础数据类型)
  16. Redhat/CentOS 制作本地yum源
  17. linux usb枚举过程分析之守护进程及其唤醒【转】
  18. JAVA-MyBatis ORM
  19. TYVJ 1940 创世纪
  20. PHP mysql 扩展库 操作mysql数据库步骤

热门文章

  1. OOP思想应该怎样来理解?
  2. WinForm判断程序是否已经在运行,且只允许运行一个实例
  3. linux shell 学习笔记--比较操作
  4. 统计日志中ip出现的次数
  5. hdu 4632 回文子序列计数
  6. PHP中不用第三个变量交换两个变量的值
  7. django模型models.py文件内容理解
  8. ASP.NET 整理比较全的URL重写解决方案
  9. angular.run 妙用
  10. el表达式对js方法的传值