2011-09-20 52 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