semble ne pas attendre la fin du groupe Je m'attends à la sortie de
Nd p = 1000000 t.count = 1000000 p> Je peux obtenir ce résultat si i i i de stade // semiaphoreend.Wait () p> , mais la sortie réelle est p> Fin p = 999871 t.count = 999881 P> Autre problème: T.compte! = P p> avec le groupe Je m'attends à la fin de toutes tâches. Pourquoi je dois me défendre // SEMAPHOREEND.WAIT ()? P> Merci P> Projet ici pour le téléchargement: https://github.com/fredongithub/semplore_to_modify_1 p> p>
3 Réponses :
J'ai mis en groupe_2.Lave () dans un mauvais endroit.
Comme ici En attente jusqu'à la fin de la tâche && GCD Expliquez et d'autres comme 2. DISPATCHGROUP Vous devez le mettre dans la fonction ASYNC dans son achèvement P> avec cette solution, je n'ai pas besoin de tester si p == max pour déverrouiller le Impression finale du tableau (Semaphoreend.signal ()) P> Cependant, il existe une bonne note de Vadian A > "Non, vous devez démarrer et arrêter l'exécution explicitement." P> Je cherche cette implémentation, c'est incroyable, sortant p> h2>
Une autre solution pour ce problème (sans groupe d'attente): Selon le Conseil de Vadian
voir Comment sortir d'un runloop? , Fondation de base> CFRONLOOP P>
let oneSem_1 = DispatchSemaphore(value: 1)
let semaphore = DispatchSemaphore(value: 4)
var p=0
var t:[Int]=[]
let MAX=100_000
#if DEBUG
print("DEBUG")
// Store a reference to the current run loop
let runLoop = CFRunLoopGetCurrent()
#endif
func task(){
//sleep(1)
oneSem_1.wait()
p+=1
t.append(p)//ressource critique, sinon pas rempli à fond
if p == MAX{
#if DEBUG
print("CFRunLoopStop(runLoop)")
CFRunLoopStop(runLoop)
#else
DispatchQueue.main.async{
print("CFRunLoopStop(CFRunLoopGetCurrent())")
CFRunLoopStop(CFRunLoopGetCurrent())
}
#endif
}
oneSem_1.signal()
}
for _ in 0..<MAX {
DispatchQueue.global().async{
semaphore.wait()
// print("wake up")
task()
// print("end")
semaphore.signal()
}
}
// Start run loop after work has been started
print("start")
CFRunLoopRun()
print("END p=\(p) t.count=\(t.count)")
Encore une fois une autre solution pour ce problème (sans groupe d'attente)
Utilisation de processus et de threads Apple> Runloop :: Selon le Conseil de Vadian p>
voir attendre jusqu'à la fin de la tâche A >, Fundation> Processus et threads> Runloop P>
// Store a reference to the current run loop
var shouldKeepRunning = true
let runLoop = RunLoop.current
func task(){
//sleep(1)
oneSem_1.wait()
p+=1
t.append(p)//ressource critique, sinon pas rempli à fond
if p == MAX{
print("p == MAX")
// shouldKeepRunning = false//BUG!!
DispatchQueue.main.async{//METTRE CECI
shouldKeepRunning = false
}
}
oneSem_1.signal()
}
for _ in 0..<MAX {
DispatchQueue.global().async{
semaphore.wait()
//print("wake up")
task()
//print("end")
semaphore.signal()
}
}
// Start run loop after work has been started
print("start")
while shouldKeepRunning && runLoop.run(mode: .default, before: .distantFuture)
{
print("WROTE ONLY ONCE")
}
print("END p=\(p) t.count=\(t.count)")
Vous avez utilisé DISPATCHQUATE.GLOBAL (). ASYNC, le bloc est exécuté sur la file d'attente principale de manière asynchrone, de sorte que le groupe_2 entre alors soudainement la sortie et votre bloc est exécuté de manière asynchrone.
J'ai commenté tout pour le code de boucle // pour _ in 0 .. et efficacement, il passe le groupe_2 attendre pour imprimer le tableau
Désolé, c'est horrible code. Veuillez apprendre à gérer le traitement des données asynchrones. DIT, ne demandez pas i> b>. Et pour exécuter un code asynchrone dans une CLI, vous avez besoin d'un sellogue de toute façon.
Cli = interface de ligne de commande. Pensez-vous que je reçois un runloop si je marche // tandis que (p! = Max) {// USLEeP (1_00_000) // Imprimer ("P =", P) //}?
Non, vous devez démarrer et arrêter explicitement l'alunloop.
Je mets ci-dessous une première solution avec Runloop
J'aimerais que votre Vadian nous dise de quoi préférez-vous de ces 2 solutions d'exécution. Un de fondation de base> cfrunloop et une autre de Fondation> Processus et threads> Runloop . Merci
Quelqu'un peut expliquer le meilleur de ces 2 solutions d'exécution?