我想每个实例只运行一次代码块.
我可以将dispatch_once_t谓词声明为成员变量而不是静态变量吗?
从GCD参考资料中,我不清楚.
谓词必须指向存储在全局或静态范围内的变量.使用具有自动或动态存储的谓词的结果是未定义的.
我知道我可以使用dispatch_semaphore_t和一个布尔标志来做同样的事情.我只是好奇.
我试图了解这两者之间的区别和用法:
static void *myFirstQueue = "firstThread";
dispatch_queue_t firstQueue = dispatch_queue_create("com.year.new.happy", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_set_specific(firstQueue, myFirstQueue, (void*) myFirstQueue, NULL);
Run Code Online (Sandbox Code Playgroud)
问题#1
这有什么区别:
dispatch_sync(firstQueue, ^{
if(dispatch_get_specific(myFirstQueue))
{
//do something here
}
});
Run Code Online (Sandbox Code Playgroud)
以下内容:
dispatch_sync(firstQueue, ^{
if(firstQueue == dispatch_get_current_queue())
{
//do something here
}
});
Run Code Online (Sandbox Code Playgroud)
?
问题2:
而不是使用上面(void*) myFirstQueue的
dispatch_queue_set_specific(firstQueue, myFirstQueue, (void*) myFirstQueue, NULL);
Run Code Online (Sandbox Code Playgroud)
我们可以static int * myFirstQueue = 0;改用吗?
我的理由是基于以下事实:
dispatch_once_t也是0(这里有任何关联吗?顺便说一下,我仍然不明白为什么dispatch_once_t必须初始化为0,尽管我已经在这里读过关于SO的问题).
问题#3
你能举一个GCD死锁的例子吗?
问题#4
这可能有点太多了; 无论如何,我会问,以防有人碰巧知道这个问题.如果没有,可以将此部分保留为无人接听.
我没试过这个,因为我真的不知道怎么做.但我的理念是这样的:
无论如何,我们可以在某个队列中"放置一个句柄",使我们仍然可以在其上保留句柄,从而能够检测队列被分离后何时发生死锁; 当有,并且由于我们得到了我们之前设置的队列句柄,我们可以以某种方式做一些事情来解锁僵局?
同样,如果这个问题太多而无法回答,或者如果我的推理完全可以解除/关闭(在问题#4中),请随意将此部分留空.
新年快乐.
@ san.t
同 …