2011-09-20 60 views
2

我在理解GCD时遇到了问题。我需要使用dispatch_async来产生函数put_values(),它将在无限循环中将值放入缓冲区。 Get_values()将在无限循环中移除。因此,我必须同时运行它们,而无需查看是否实现了我的信号量以便正确等待。下面的代码做到这一点(异步运行它们 )? 谢谢!dispatch_async()in c

dispatch_queue_t producer = dispatch_queue_create("producer", NULL); 
dispatch_queue_t consumer = dispatch_queue_create("consumer", NULL); 

dispatch_async(producer, 
       ^{ 
        put_values(); 
       }); 

dispatch_async(consumer, 
       ^{ 
        get_values(); 
       }); 

dispatch_main(); 

回答

1

你的代码应该这样做,除非我失去了一些东西。因为您正在使用两个不同的队列,所以它们都应该同时运行。

1

这个问题暗示了一些关于什么是大型中央调度实际上的困惑。不要以线程或“并发”的方式来思考一些大的图片目标,而是开始思考哪些操作需要同步,哪些操作可能是异步的,并且您(以及许多回答的人)会开始理解如何分解正常。首先,你的读者应该是同步的,你的编写者应该是异步的,每个值都要被读取/写入,并有一个与之相关的串行队列。然后,系统如何将其与其他串行队列(或读/写请求本身)并行化,这不是您应该关心的问题。

+0

考虑到我在问题中给出的细节,为什么每次写入都必须是异步的,为什么读取必须是同步的。 – pnizzle

+0

写入也可能是同步的,但是会给你买什么?另一个写法可能会在之后立即出现,并使其无效。相反,如果您要读取值,则需要先完成写入操作,否则您将读取陈旧的数据。 – jkh