Append est-il vraiment thread-safe ?
La synchronisation est cruciale lorsqu'il s'agit d'un accès simultané à des ressources partagées dans Go. Une pratique courante consiste à ajouter des éléments à une tranche à l'aide de goroutines. Cependant, la fonction append n'est pas intrinsèquement thread-safe.
Dans le cas décrit, la création de goroutines distinctes dans une boucle à ajouter à une tranche peut entraîner des incohérences de données. En effet, plusieurs goroutines écrivant simultanément sur la même tranche peuvent entraîner des courses de données.
Pour démontrer cela, considérons l'extrait de code suivant :
destSlice := make([]myClass, 0) var wg sync.WaitGroup for _, myObject := range sourceSlice { wg.Add(1) go func(closureMyObject myClass) { defer wg.Done() var tmpObj myClass tmpObj.AttributeName = closureMyObject.AttributeName destSlice = append(destSlice, tmpObj) }(myObject) } wg.Wait()
Exécuter ce code avec l'option -race révélera plusieurs courses de données. Pour empêcher ces courses, un mécanisme de synchronisation tel qu'un mutex doit être utilisé. Voici un extrait de code révisé utilisant un mutex :
var ( mu = &sync.Mutex{} destSlice = make([]myClass, 0) ) var wg sync.WaitGroup for _, myObject := range sourceSlice { wg.Add(1) go func(closureMyObject myClass) { defer wg.Done() var tmpObj myClass tmpObj.AttributeName = closureMyObject.AttributeName mu.Lock() destSlice = append(destSlice, tmpObj) mu.Unlock() }(myObject) } wg.Wait()
Une solution alternative consiste à utiliser un canal dans lequel les goroutines envoient les valeurs à ajouter. Une goroutine dédiée peut gérer la réception de ces valeurs et effectuer l'opération d'ajout.
En résumé, alors que les éléments de tranche sont des variables distinctes et peuvent être consultés simultanément sans synchronisation, les en-têtes de tranche nécessitent une synchronisation pour éviter les courses de données lors d'opérations d'ajout simultanées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!