深入浅出 Cocoa 多线程编程之 block 与 dispatch quene
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// insert code here
NSLog(@"Hello, World!");
[pool drain];
return 0;
}
aBlock();
aBlock = ^(void) {
NSLog(@"Hello, World!");
};
aBlock();
^(void){ NSLog(@" >> This is block 1!"); },
^(void){ NSLog(@" >> This is block 2!"); }
};
blocks[0]();
blocks[1]();
if (x) {
block = ^{ printf("true\n"); };
} else {
block = ^{ printf("false\n"); };
}
block();
struct Block __tmp_1 = ; // setup details
block = &__tmp_1;
} else {
struct Block __tmp_2 = ; // setup details
block = &__tmp_2;
}
__block int blockLocal = 100;
static int staticLocal = 100;
void (^aBlock)(void) = ^(void){
NSLog(@" >> Sum: %d\n", global + staticLocal);
global++;
blockLocal++;
staticLocal++;
};
aBlock();
NSLog(@"After modified, global: %d, block local: %d, static local: %d\n", global, blockLocal, staticLocal);
[pool drain];
执行之后,值均为:101
// 1
void (^aBlock)(int) = 0;
static void (^ const staticBlock)(int) = ^(int i) {
if (i > 0) {
NSLog(@" >> static %d", i);
staticBlock(i - 1);
}
};
aBlock = staticBlock;
aBlock(5);
// 2
__block void (^blockBlock)(int);
blockBlock = ^(int i) {
if (i > 0) {
NSLog(@" >> block %d", i);
blockBlock(i - 1);
}
};
blockBlock(5);
[pool drain];
initData();
// create dispatch queue
//
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
int sum = 0;
for(int i = 0; i < Length; i++)
sum += data[i];
NSLog(@" >> Sum: %d", sum);
flag = YES;
});
// wait util work is done.
//
while (!flag);
dispatch_release(queue);
[pool drain];
dispatch_queue_create 的定义如下:
我们也可以使用
下面来看代码:
initData();
// Create a semaphore with 0 resource
//
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
// create dispatch semaphore
//
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
int sum = 0;
for(int i = 0; i < Length; i++)
sum += data[i];
NSLog(@" >> Sum: %d", sum);
// signal the semaphore: add 1 resource
//
dispatch_semaphore_signal(sem);
});
// wait for the semaphore: wait until resource is ready.
//
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(sem);
dispatch_release(queue);
[pool drain];
initData();
__block int sum = 0;
// Create a semaphore with 0 resource
//
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
__block dispatch_semaphore_t taskSem = dispatch_semaphore_create(0);
// create dispatch semaphore
//
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_block_t task1 = ^(void) {
int s = 0;
for (int i = 0; i < Length; i++)
s += data[i];
sum = s;
NSLog(@" >> after add: %d", sum);
dispatch_semaphore_signal(taskSem);
};
dispatch_block_t task2 = ^(void) {
dispatch_semaphore_wait(taskSem, DISPATCH_TIME_FOREVER);
int s = sum;
for (int i = 0; i < Length; i++)
s -= data[i];
sum = s;
NSLog(@" >> after subtract: %d", sum);
dispatch_semaphore_signal(sem);
};
dispatch_async(queue, task1);
dispatch_async(queue, task2);
// wait for the semaphore: wait until resource is ready.
//
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(taskSem);
dispatch_release(sem);
dispatch_release(queue);
[pool drain];
initData();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
__block int sum = 0;
__block int *pArray = data;
// iterations
//
dispatch_apply(Length, queue, ^(size_t i) {
sum += pArray[i];
});
NSLog(@" >> sum: %d", sum);
dispatch_release(queue);
[pool drain];
initData();
__block int sum = 0;
// Create a semaphore with 0 resource
//
__block dispatch_semaphore_t taskSem = dispatch_semaphore_create(0);
// create dispatch semaphore
//
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_group_t group = dispatch_group_create();
dispatch_block_t task1 = ^(void) {
int s = 0;
for (int i = 0; i < Length; i++)
s += data[i];
sum = s;
NSLog(@" >> after add: %d", sum);
dispatch_semaphore_signal(taskSem);
};
dispatch_block_t task2 = ^(void) {
dispatch_semaphore_wait(taskSem, DISPATCH_TIME_FOREVER);
int s = sum;
for (int i = 0; i < Length; i++)
s -= data[i];
sum = s;
NSLog(@" >> after subtract: %d", sum);
};
// Fork
dispatch_group_async(group, queue, task1);
dispatch_group_async(group, queue, task2);
// Join
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_release(taskSem);
dispatch_release(queue);
dispatch_release(group);
[pool drain];
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene相关推荐
- [Cocoa]深入浅出Cocoa多线程编程之 block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
- block 与 dispatch quene
深入浅出 Cocoa 多线程编程之 block 与 dispatch quene 罗朝辉(http://www.cppblog.com/kesalin CC 许可,转载请注明出处 block 是 Ap ...
- iOS多线程编程之NSThread的使用(★★★推荐,为原作者点赞★★★)
文章来源:http://blog.csdn.net/totogo2010/article/details/8010231 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThre ...
- python 多线程编程之_thread模块
python 多线程编程之_thread模块 参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁 ...
- 多线程编程之Linux环境下的多线程(三)——好文
http://www.cnblogs.com/kuliuheng/p/4063892.html 前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环 ...
- Java 多线程编程之 interruptException
下面是java 多线程中的异常处理: package multithread; public class InterruptException { public static void main(St ...
- 30. 多线程编程之threading模块
Python提供多线程编程的模块有以下两个. _thread: threading. 其中_thread模块提供了低级别的基本功能来支持多线程功能,提供简单的锁来确保同步,推荐使用threading模 ...
- [python学习] 专题八.多线程编程之thread和threading
就个人而言,学了这么多年的课程又写了这么多年的程序,虽然没有涉及到企业级的项目,但还是体会到了有几个知识点是非常重要的,包括:面向对象的思想.如何架构一个项目.设计模式来具体解决问题.应用机器学习和深 ...
- 多线程编程之Apue3rd_Chapter11之互斥锁_读写锁_自旋锁
学习了apue3rd的第11章,主要讲的是多线程编程.因为线程共享进程的资源比如堆和全局变量,多线程编程最重要的是,使用各种锁进行线程同步. 线程编程首先要学习的三个函数如下: #include &l ...
最新文章
- linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程
- 快手日入数据量超 5120TB,数据管治如何做?
- Python 函数参数的分类及使用方法
- java中在做除法操作时,对有余数的结果进行取整
- 计算机网络实验(华为eNSP模拟器)——第十章 Eth-Trunk(链路聚合)
- 你见过的“垃圾”项目是这样子么?
- mysql数据库架构_MySQL数据库之互联网常用架构方案
- php 单例模式有什么缺点_PHP的完整形式是什么?
- SQL Server中的text类型字段要如何查询?
- 七个你一定会犯的云安全错误
- 复杂sql 查询编写方法_学习SQL:如何编写复杂的SELECT查询
- 009Maven_建立私服——报错问题
- PowerDesigner显示Comment注释栏
- 传感器网络与物联网-1.射频识别技术
- win7 计算机游戏不见了怎么办,小编教你解决Win7系统下找不到自带小游戏的问题...
- 基于单片机的智能家居环境监控系统的设计
- 1024happyCTF
- O2O、B2B、C2C(通俗讲解)
- 【Origin】Origin准确标注某点
- 《程序员》12月精彩内容:双11技术决战
热门文章
- hadoop生态的kerberos认证系列2-hadoop
- 【SemiDrive源码分析】【X9芯片启动流程】23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇
- 第一周 第五讲 夹逼准则及重要的极限I
- iPad mini 2设计转变无边框
- 【Adobe】解决 Indesign 因 plugplugowl.dll 出现闪退问题
- 电子防抖(EIS)无效的相关修改
- 科技赋能,泰然金融开启上市征程
- typecho模板ajax,Typecho实现全站式Ajax的方法
- Android课设电台论文,【播音主持论文】播音主持论文范文(共40篇)
- android 华为pad 自动对焦,有料更有“生产力”,华为平板M6体验,补足安卓生态短板...