iPhone: Comment puis-je mettre en œuvre sémaphore?
Quelqu'un peut-il expliquer comment je peux le mettre en œuvre sémaphore en Objective-C?
J'ai fait beaucoup de recherche sur google sur le sujet, mais je n'ai pas trouvé quelque chose de compréhensible.
Si vous avez certainement besoin d'un réel sémaphore, probablement la meilleure chose à utiliser est le PGCD de envoi des sémaphores. J'avais mis une explication, mais le code du lien est assez simple. Vous devriez être en mesure de le suivre.
En gros, vous créez le sémaphore avec un paramètre qui indique le nombre d'instances simultanées de vos ressources, vous pouvez avoir. Puis threads qui veulent utiliser les ressources d'attente sur le sémaphore jusqu'à ce que l'on devient disponible et le signaler quand elles sont faites.
Envisager d'utiliser un l'expédition de la file d'attente ou un NSOperationQueue au lieu de cela, avec en même temps une limite du nombre de cas de vos ressources. C'est le approuvés Apple façon de faire de telles choses.
Vous devriez regarder dans l'aide de NSLock ou NSCondition si vous souhaitez gérer la protection des données et de la section critique vous-même. Vous pouvez également utiliser le @synchronisé directive. Vous pouvez aussi utiliser l'habituel API POSIX thread si vous en avez envie bien qu'il n'est pas recommandé que le Cacao vous donne beaucoup de plus haut niveau stuff, qui est plus simple et plus agréable. Cette discussion a été utile pour moi.
Objective-C supporte le multithreading dans les applications. Par conséquent, les deux threads pouvez essayer de modifier le même objet dans le même temps, une situation qui peut causer de graves problèmes dans un programme. Afin de protéger les sections de code signé par plus d'un thread à la fois, Objective-C, le @synchronisée() directive.
L' @synchronisée()directive verrouille une section de code pour une utilisation par un seul thread. Les autres threads sont bloqués jusqu'à ce que le fil sort de l'protégés code, lorsque l'exécution se poursuit après la dernière instruction dans l' @synchronisée() bloc.
L' @synchronisée() directive prend comme seul argument Objective-C objet, y compris soi-même. Cet objet est connu comme un sémaphore d'exclusion mutuelle ou d'un mutex. Il permet à un thread pour verrouiller une section de code pour empêcher son utilisation par d'autres threads. Vous devriez utiliser des sémaphores pour protéger les différentes sections critiques d'un programme. Il est plus sûr de créer de toutes l'exclusion mutuelle des objets avant l'application devient multithread, afin d'éviter des conditions de course.
Exemple:
Account*account =[Account accountFromString:[accountField stringValue]];//Get the semaphore.
id accountSemaphore =[Account semaphore];@synchronized(accountSemaphore){//Critical code....}
Un sémaphore est pas juste un verrou. d'accord, cependant, si vous faites référence pour le comptage des sémaphores (qui peut être verrouillé/acquis et débloqué/a signalé à plusieurs reprises) puis NSRecursiveLock devrait faire l'affaire. NSRecusiveLock n'est pas la même chose que le sémaphore soit. pourriez-vous me dire la différence? La définition que j'ai trouver est: "En informatique, un sémaphore est une variable ou d'un type abstrait de données qui fournit un simple mais utile, abstraction pour le contrôle de l'accès par plusieurs processus d'une ressource commune dans un environnement de programmation parallèle." Un sémaphore est généralement mis en œuvre comme un compteur à partir d'une valeur initiale. Un processus en attente sur un sémaphore essaie de décrémenter le compteur, si le compteur est à zéro, il bloque jusqu'à ce que le compteur a été incrémenté par un autre processus. Quand c'est fait, le sémaphore, les signaux de processus qui incrémente le compteur, ou, si un processus est bloqué sur elle, permet de débloquer le processus.
C api peuvent être trouvés dans
sys/semaphore.h
. l'utilisation de ces dans votre objc wrapper/mise en œuvre.cette exemple de base est le premier résultat quand 'sem_trywait l'exemple" est googlé. il vous montre comment vous pouvez utiliser ces api.
alors une interface minimale serait de prendre cette forme:
mais il est probable que vous voudrez également l'objet d'abstraire l'init et la destruction des routines de la part du client.
OriginalL'auteur justin
Si vous avez certainement besoin d'un réel sémaphore, probablement la meilleure chose à utiliser est le PGCD de envoi des sémaphores. J'avais mis une explication, mais le code du lien est assez simple. Vous devriez être en mesure de le suivre.
En gros, vous créez le sémaphore avec un paramètre qui indique le nombre d'instances simultanées de vos ressources, vous pouvez avoir. Puis threads qui veulent utiliser les ressources d'attente sur le sémaphore jusqu'à ce que l'on devient disponible et le signaler quand elles sont faites.
Envisager d'utiliser un l'expédition de la file d'attente ou un NSOperationQueue au lieu de cela, avec en même temps une limite du nombre de cas de vos ressources. C'est le approuvés Apple façon de faire de telles choses.
de Lange, La Simultanéité Guide de Programmation
OriginalL'auteur JeremyP
Vous devriez regarder dans l'aide de NSLock ou NSCondition si vous souhaitez gérer la protection des données et de la section critique vous-même. Vous pouvez également utiliser le @synchronisé directive. Vous pouvez aussi utiliser l'habituel API POSIX thread si vous en avez envie bien qu'il n'est pas recommandé que le Cacao vous donne beaucoup de plus haut niveau stuff, qui est plus simple et plus agréable. Cette discussion a été utile pour moi.
NSLock
OriginalL'auteur jbat100
De Apple Docs (Threading):
Exemple:
d'accord, cependant, si vous faites référence pour le comptage des sémaphores (qui peut être verrouillé/acquis et débloqué/a signalé à plusieurs reprises) puis NSRecursiveLock devrait faire l'affaire.
NSRecusiveLock n'est pas la même chose que le sémaphore soit.
pourriez-vous me dire la différence? La définition que j'ai trouver est: "En informatique, un sémaphore est une variable ou d'un type abstrait de données qui fournit un simple mais utile, abstraction pour le contrôle de l'accès par plusieurs processus d'une ressource commune dans un environnement de programmation parallèle."
Un sémaphore est généralement mis en œuvre comme un compteur à partir d'une valeur initiale. Un processus en attente sur un sémaphore essaie de décrémenter le compteur, si le compteur est à zéro, il bloque jusqu'à ce que le compteur a été incrémenté par un autre processus. Quand c'est fait, le sémaphore, les signaux de processus qui incrémente le compteur, ou, si un processus est bloqué sur elle, permet de débloquer le processus.
OriginalL'auteur Nekto