相关疑难解决方法(0)

我可以将dispatch_once_t谓词声明为成员变量而不是静态吗?

我想每个实例只运行一次代码块.

我可以将dispatch_once_t谓词声明为成员变量而不是静态变量吗?

GCD参考资料中,我不清楚.

谓词必须指向存储在全局或静态范围内的变量.使用具有自动或动态存储的谓词的结果是未定义的.

我知道我可以使用dispatch_semaphore_t和一个布尔标志来做同样的事情.我只是好奇.

objective-c grand-central-dispatch

24
推荐指数
3
解决办法
6026
查看次数

dispatch_queue_set_specific与获取当前队列

我试图了解这两者之间的区别和用法:

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

同 …

deadlock grand-central-dispatch ios objective-c-blocks

6
推荐指数
1
解决办法
5792
查看次数