我有一個生產者和一個消費者。生產者用對象填充其內部隊列,消費者逐個獲取這些對象。我想將消費者與生產者同步,以便消費者在沒有對象準備就緒的情況下阻止,並且我想讓生產者與自己同步,以便當隊列滿時停止生產(當有空間時重新開始生產) 。我怎麼做?我能夠使用NSConditionalLock
解決一個沒有隊列的簡單案例,但通過隊列,問題看起來更加複雜。同步生產者,消費者和生產者隊列
0
A
回答
0
我結束了使用兩個信號量,objectsReady
和bufferFreeSlots
:
@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或調度隊列。讓您的生產操作(在生產者隊列中)在主線程上根據需要發送消息給消費者隊列添加消費操作的對象。
相關問題
- 1. 生產者和消費者的Java同步隊列線程
- 2. 生產者 - 消費者使用同步
- 3. Java生產者 - 消費者:生產者不「通知()」消費者
- 4. 消費者過濾的生產者 - 消費者阻塞隊列
- 5. LinkedBlockingQueue - 生產者/消費者
- 6. POSIX生產者 - 消費者
- 7. Nito.AsyncEx異步生產者/消費者隊列不處理
- 8. MPI - 生產者和消費者
- 9. Kafka transactional生產者和消費者
- 10. Java線程生產者和消費者
- 11. Apache Camel Restlet消費者和生產者
- 12. 生產者消費者在PHP和Java
- 13. 生產者和消費者優化
- 14. 鎖定免費隊列 - 單個生產者,多個消費者
- 15. 隊列爲多個生產者和消費者
- 16. 同步生產者和消費者與循環緩衝
- 17. 一個生產者,兩位消費者作用於由生產者生產
- 18. 不同語言的生產者和消費者的Redis消息隊列
- 19. 消費者生產者多線程消費者不會消逝
- 20. 隊列:N生產者到N消費者
- 21. 單個生產者多個消費者 - 隊列包含null
- 22. 使用隊列的生產者/消費者線程
- 23. 單生產者單一消費者隊列與「阻塞」流行
- 24. 生產者中的死鎖消費者C#有界隊列
- 25. 多生產者多消費者無鎖(甚至等待)隊列
- 26. JBOSS 7.1中隊列的JMS生產者/消費者最終
- 27. Clojure中的生產者消費者隊列
- 28. 生產者消費終止
- 29. 生產者消費者在Java中
- 30. pthreads生產者 - 消費者問題
我需要生產者停止時,緩衝區已滿(例如,包含四個對象,例如),並開始時,再次有空間。信號量照顧得很好。我可以用派遣隊列做同樣的事嗎? – zoul 2010-10-09 16:51:11
我不確定「緩衝區」是什麼意思;你在談論消費行動的隊列嗎?您可以設置NSOperationQueue的最大操作計數;它一次只能運行多項操作。我認爲你不可以用GCD來做到這一點。 – 2010-10-10 00:44:42
生產者通常比消費者快,所以我保留了生產對象的隊列。由於內存限制,我希望此隊列保持較小。這意味着當該隊列足夠大時生產者必須停止,並且一旦消費者將對象從隊列中取出,就會再次運行。隊列的最大操作數似乎沒有幫助。 – zoul 2010-10-10 07:10:26