0

プロデューサーとコンシューマーがいます。プロデューサーはその内部キューをオブジェクトで満たし、コンシューマーはこれらのオブジェクトを 1 つずつ受け取ります。オブジェクトの準備ができていないときに消費者がブロックするように、消費者を生産者と同期させたい、キューがいっぱいになったときに生産を停止するように生産者をそれ自体と同期させたい(スペースがあると再開する) . それ、どうやったら出来るの?を使用して、キューを使用せずに単純なケースを解決できましたが、キューを使用するNSConditionalLockと、問題はより複雑に見えます。

4

2 に答える 2

1

NSOperationQueues またはディスパッチ キューのペアを使用することを検討してください。プロダクション オペレーション (プロデューサー キュー内) で、必要に応じてメイン スレッドで、消費オペレーションをコンシューマー キューに追加するオブジェクトにメッセージを送信します。

于 2010-10-09T16:48:34.327 に答える
0

私は2つのセマフォを使用することに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最大キュー サイズに初期化されます。今のところうまくいっているように見えますが、神はこれが信仰の行為であり、確固たる自信ではないことをご存じです。

于 2010-10-09T16:32:55.143 に答える