http://itjoy.org/?p=568
函数的作用:如果任务是通过dispatch_barrier_async函数追加到concurrent queue中的,执行该任务时,其他的线程不执行,直到该任务完成,才恢复执行剩余的任务。
多线程对数据库和文件读写的操作,多个写操作不能同时出现针对一个表的操作,这样可能造成脏数据,发生意想不到的错误,我们可以使用serial queue 来避免。但是多个读操作可以并行执行,这样可以提高效率。有时我们希望读取的时候又来更新数据,后续读取的数据将是更新后的数据。如果只是简单的将这一系列的任务添加到concurrent queue中,那么就会出现脏数据,如何避免呢,就是用dispatch_barrier_async来操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
///
dispatch_queue_t
queue
=
dispatch_queue_create
(
"org.itjoy.gcd"
,
DISPATCH_QUEUE_CONCURRENT
)
;
dispatch_async
(
queue
,
^
{
//sleep(5);
NSLog
(
@"1 reading"
)
;
}
)
;
dispatch_async
(
queue
,
^
{
//sleep(2);
NSLog
(
@"2 reading"
)
;
}
)
;
// dispatch_async(queue, ^{
// NSLog(@"writing");
// });
dispatch_barrier_async
(
queue
,
^
{
NSLog
(
@"writing***"
)
;
}
)
;
dispatch_async
(
queue
,
^
{
//sleep(1);
NSLog
(
@"3 reading"
)
;
}
)
;
dispatch_async
(
queue
,
^
{
NSLog
(
@"4 reading"
)
;
}
)
;
dispatch_release
(
queue
)
;
//**********************************************************
// 简单的添加,可能读取的数据有误
// 2013-08-15 13:51:11.490 GCD[4285:12803] 2 reading
// 2013-08-15 13:51:11.491 GCD[4285:14f03] 3 reading
// 2013-08-15 13:51:11.490 GCD[4285:12303] 1 reading
// 2013-08-15 13:51:11.491 GCD[4285:14d0f] writing
// 2013-08-15 13:51:11.493 GCD[4285:12803] 4 reading
// 2013-08-15 13:51:44.850 GCD[4313:14d0f] writing
// 2013-08-15 13:51:44.850 GCD[4313:12303] 1 reading
// 2013-08-15 13:51:44.850 GCD[4313:12b03] 2 reading
// 2013-08-15 13:51:44.850 GCD[4313:14f03] 3 reading
// 2013-08-15 13:51:44.853 GCD[4313:14d0f] 4 reading
//**********************************************************
// 使用dispatch_barrier_async添加的任务,在其之后添加的任务将等待他执行完成,才会执行剩余的
// 2013-08-15 13:52:24.107 GCD[4338:12b03] 2 reading
// 2013-08-15 13:52:24.107 GCD[4338:12303] 1 reading
// 2013-08-15 13:52:24.109 GCD[4338:12303] writing***
// 2013-08-15 13:52:24.109 GCD[4338:12303] 3 reading
// 2013-08-15 13:52:24.109 GCD[4338:12b03] 4 reading
// 2013-08-15 13:52:50.560 GCD[4353:12303] 1 reading
// 2013-08-15 13:52:50.561 GCD[4353:12c03] 2 reading
// 2013-08-15 13:52:50.571 GCD[4353:12c03] writing***
// 2013-08-15 13:52:50.571 GCD[4353:12c03] 3 reading
// 2013-08-15 13:52:50.572 GCD[4353:12c03] 4 reading
|