既然GCD中使用dispatch_sync()是不会开启线程的, 那么有什么意义呢?是不是同步对于线程是没有意义的?异步才是有意义的?
1
fogisland 2015-06-27 16:09:20 +08:00 via iPhone
有些时候必须要把一些动作交给另外一个线程去做,同时当前线程要等待结果返回才能继续往下走。这时候就需要dispatch_sync。多线程不一定非得异步才有意义啊。
|
2
yahoo21cn 2015-06-27 16:21:33 +08:00 2
你把GCD关掉,换GMD的协程模式试试
|
3
miki6180 OP @fogisland 那不就意味这是多条线程的同步, 但是我这样写打印出来的线程的number值是一样的, 也就是说是在同一条线程。
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_queue_create("cn.lovegh", DISPATCH_QUEUE_PRIORITY_DEFAULT), ^{ NSLog(@"%@", [NSThread currentThread]); } ); }。然道它的意思是阻塞当前线程, 那岂不是还要自己开线程, 在哪个线程中再用dispatch_sync()... |
4
miki6180 OP @fogisland 代码写错,是这段
- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_queue_create("cn.lovegh", DISPATCH_QUEUE_PRIORITY_DEFAULT), ^{ NSLog(@"%@", [NSThread currentThread]); } ); |
5
xhacker 2015-06-27 16:35:16 +08:00 1
dispatch_sync 确实基本用不到。只有一个场景,就是你可以用 dispatch queue 代替锁。参见 http://stackoverflow.com/questions/4607125/using-dispatch-sync-in-grand-central-dispatch 。
|
7
fogisland 2015-06-27 16:44:21 +08:00 via iPhone
@anonysecurity gcd是对线程池的封装,泥这样写,系统很可能就会把新建的gcd分配在当前线程了,因为这样已经满足你的需求了。你如果自己开一个线程,在里面dispatch sync到main queue,就能看到线程是不一样的了。手机打字说不清楚,建议你去了解下gcd和线程的关系就都明白了
|
8
miki6180 OP @fogisland 嗯, 但是有一点是没错, 它不会新开线程。我看了stackoverflow的大概明白了, 就是用来代替锁, 实现多线程的同步~~~生产者消费者的一种模型~。
|
9
66450146 2015-06-27 18:54:30 +08:00
一个简单的场景是,把 CoreData 放在了另一个 queue 上运行,操作 CoreData 之后要根据更新后的内容刷新 view
|
10
elgoog 2015-06-27 20:15:02 +08:00
本帖有一层楼被删了
|
14
Marfal 2015-06-27 20:37:12 +08:00
我还以为是gong、c、dang。。。
|
18
ugvfpdcuwfnh 2015-06-27 23:55:44 +08:00
@elgoog
怎么发现的(⊙_⊙?) |
19
flowfire 2015-06-28 00:38:01 +08:00
.............这标题。。。
|
20
freed 2015-06-28 00:41:31 +08:00
不止一层..被删了好几层...
因为帖子刚发没多久我看了 本来上面有好几层说以为是....... 的回复的.... |
21
blessme 2015-06-28 01:35:35 +08:00
这标题要小心被系统抓取导致拔网线。
|
22
HFX3389 2015-06-28 11:33:09 +08:00
|
23
tao1991123 2015-06-28 12:18:32 +08:00
看到GCD还是以为共chan党的代称,还在想 v2ex啥时候变政治论坛了,进来一看。我想多了
|
24
xieyudi1990 2015-06-29 04:45:13 +08:00
第一个想到的是共残党. 第二个想到的是最大公约数.
|
25
rekey 2015-06-29 13:34:35 +08:00
看标题吓尿了。
|