2010-10-09 14 views
0

J'ai un producteur et un consommateur. Le producteur remplit sa file d'attente interne avec des objets, le consommateur prend ces objets un par un. Je veux synchroniser le cosommateur avec le producteur, de sorte que le consommateur bloque quand il n'y a pas d'objets prêts, et je veux synchroniser le producteur avec lui-même, afin qu'il cesse de produire quand la file est pleine (et recommence quand il y a de l'espace) . Comment je fais ça? J'ai été capable de résoudre un cas plus simple sans la file d'attente en utilisant NSConditionalLock, mais avec la file d'attente le problème semble plus complexe.Synchronisation du producteur, du consommateur et de la file d'attente du producteur

Répondre

0

I a fini en utilisant deux sémaphores, objectsReady et 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 

Le bufferFreeSlots est initialisé à la taille maximale de file d'attente. Jusqu'à présent, cela semble fonctionner, mais Dieu sait que c'est un acte de foi, pas une confiance solide.

1

Vous pouvez envisager d'utiliser une paire de NSOperationQueues ou des files d'attente d'envoi. Demandez à vos opérations de production (dans la file d'attente du producteur) d'envoyer des messages, sur le thread principal si nécessaire, à un objet qui ajoute des opérations de consommation à la file d'attente client.

+0

J'ai besoin que le producteur s'arrête quand le tampon est plein (= contient quatre objets, par exemple) et commence quand il y a de nouveau de l'espace. Les sémaphores s'en occupent très bien. Puis-je faire la même chose avec une file d'attente de répartition? – zoul

+0

Je ne suis pas sûr de ce que vous voulez dire par "tampon"; Parlez-vous de la file d'attente des opérations de consommation? Vous pouvez définir le nombre maximal d'opérations d'une NSOperationQueue; il ne fonctionnera pas plus que de nombreuses opérations à la fois. Je ne pense pas que vous pouvez le faire avec GCD. –

+0

Le producteur est généralement plus rapide que le consommateur, donc je garde une file d'attente des objets produits. Je veux que cette file d'attente reste petite à cause des contraintes de mémoire. Cela signifie que le producteur doit s'arrêter lorsque cette file d'attente est suffisamment grande et redémarrer une fois que le consommateur a sorti un objet de la file d'attente. Le nombre maximal d'opérations de la file ne semble pas aider à cela. – zoul