block可用于并行编程,线程同步多用信号量来实现,保证执行完一个block再执行下一个block,当所有block都执行完毕后,再利用group,通知执行后面的代码,使用wait(阻塞线程),或notify(不阻塞线程)等待执行结束后再继续。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
static volatile BOOL flag = NO;
//一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
static const int Length = 1000000000;
static int Data[Length];
static void initData() {
for (int i = 0; i < Length; i++) {
Data[i] = i+1;
}
}
#define Test_Mode 7
int main(int argc, char * argv[]) {
@autoreleasepool {
#if Test_Mode == 0
//local block
void (^myBlock) (void) = ^(void){
NSLog(@"I am a block");
};
myBlock = ^{
NSLog(@"I have been changed");
};
myBlock();
#elif Test_Mode == 1
//array block
void (^blockArray[2])(void) = {
^{
NSLog(@"block 1");
},
^{
NSLog(@"block 2");
},
};
blockArray[0]();
blockArray[1]();
//block该如何修改外部变量呢?有两