2010-10-09 134 views
0

我有一個生產者和一個消費者。生產者用對象填充其內部隊列,消費者逐個獲取這些對象。我想將消費者與生產者同步,以便消費者在沒有對象準備就緒的情況下阻止,並且我想讓生產者與自己同步,以便當隊列滿時停止生產(當有空間時重新開始生產) 。我怎麼做?我能夠使用NSConditionalLock解決一個沒有隊列的簡單案例,但通過隊列,問題看起來更加複雜。同步生產者,消費者和生產者隊列

回答

0

我結束了使用兩個信號量,objectsReadybufferFreeSlots

@implementation Producer 

- (id) getNextObject { 
    [objectsReady wait]; 
    id anObject = [[buffer objectAtIndex:0] retain]; 
    [buffer removeObjectAtIndex:0]; 
    [bufferFreeSlots signal]; 
    return [anObject autorelease]; 
} 

- (void) decodeLoop { 
    while (1) { 
     [bufferFreeSlots wait]; 
     [buffer push:[self produceAnObject]]; 
     [objectsReady signal]; 
    } 
} 

@end 

bufferFreeSlots被初始化爲最大隊列大小。到目前爲止它似乎有效,但上帝知道這是一種信仰的行爲,而不是一個堅定的信心。

1

你可能會考慮使用一對NSOperationQueues或調度隊列。讓您的生產操作(在生產者隊列中)在主線程上根據需要發送消息給消費者隊列添加消費操作的對象。

+0

我需要生產者停止時,緩衝區已滿(例如,包含四個對象,例如),並開始時,再次有空間。信號量照顧得很好。我可以用派遣隊列做同樣的事嗎? – zoul 2010-10-09 16:51:11

+0

我不確定「緩衝區」是什麼意思;你在談論消費行動的隊列嗎?您可以設置NSOperationQueue的最大操作計數;它一次只能運行多項操作。我認爲你不可以用GCD來做到這一點。 – 2010-10-10 00:44:42

+0

生產者通常比消費者快,所以我保留了生產對象的隊列。由於內存限制,我希望此隊列保持較小。這意味着當該隊列足夠大時生產者必須停止,並且一旦消費者將對象從隊列中取出,就會再次運行。隊列的最大操作數似乎沒有幫助。 – zoul 2010-10-10 07:10:26