var condition bool
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(item) {
if meetsCondition(item) {
condition = true
}
wg.Done()
}(item)
}
wg.Wait()
// is it safe to check condition here?
Il ya une discussion de cette question à l'ancien forum aller ici: https://groups.google.com/forum/#!topic/golang-nuts/5oHzhzXCcmM La réponse était oui, il est sûr. Ensuite, la discussion digress à utiliser de l'atome, etc., ce qui n'est pas ce que je veux demander.Est-ce que WaitGroup.Wait() implique une barrière de mémoire dans ce cas?
Il n'y a même pas une mention de WaitGroup dans la spécification et sa documentation dit WaitGroup.Wait: "Attendez blocs jusqu'à ce que le compteur WaitGroup est zéro." qui ne pas définir une relation qui se passe avant (ou le fait?). Cela signifie-t-il que la première réponse "Il est sûr de vérifier l'état après wg.Wait Returns" n'est pas officielle? Si c'est officiel, quelles en sont les raisons? Merci beaucoup si vous répondez.
Mise à jour: Cette mise à jour est effectuée après les réponses de @ peterSO @ ravi. Merci. Bien, évidemment, il peut y avoir une condition de concurrence si vous choisissez le nombre d'éléments> 1. Conseil: la condition peut être définie uniquement sur vrai. Pourtant, j'ai la même question.
Et probablement, je aurais dû déclaré que:
- architectures sous-jacentes ne peuvent être que x86, x64 ou ARM
- nombre d'articles peuvent être 1
Mise à jour 2 I question de suivi créée pour le cas où le nombre d'articles == 1 ici: Can you make this 'incorrectly synchronized' test fail?