▷ Mutexes en Go → 【 Tutorial de Golang 】 (2024)

En programas concurrentes, múltiples goroutines pueden intentar acceder y modificar datos compartidos al mismo tiempo, lo que puede llevar a problemas como condiciones de carrera.

Los mutexes en Go proporcionan una manera de garantizar que solo una goroutine pueda acceder a una sección crítica del código a la vez, asegurando así la integridad de los datos.

¿Qué es un Mutex en Go?

Un mutex, o mutual exclusion (exclusión mutua), es una primitiva de sincronización que se utiliza para proteger el acceso a recursos compartidos en un entorno concurrente. En Go, el paquete sync proporciona el tipo Mutex, que permite bloquear y desbloquear el acceso a estos recursos.

Concepto Básico de Funcionamiento:

  • Lock: Una goroutine adquiere el mutex, bloqueando el acceso a la sección crítica. Ninguna otra goroutine puede acceder a esta sección mientras el mutex esté bloqueado.
  • Unlock: Una vez que la goroutine termina de usar el recurso compartido, libera el mutex, permitiendo que otras goroutines adquieran el bloqueo.

Sintaxis Básica de un Mutex en Go

package mainimport ( "fmt" "sync")var contador intvar mutex sync.Mutexfunc incrementar() { mutex.Lock() // Bloquea el mutex para asegurar acceso exclusivo contador++ mutex.Unlock() // Desbloquea el mutex}func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() incrementar() }() } wg.Wait() fmt.Println("Valor final del contador:", contador)}Lenguaje del código: Go (go)

Explicación del Código:

  1. Declaración de Variables:
  • contador: Un entero que será incrementado por múltiples goroutines.
  • mutex: Una instancia de sync.Mutex que protegerá el acceso a contador.
  1. Función incrementar:
  • mutex.Lock(): La goroutine que ejecuta incrementar adquiere el mutex, bloqueando el acceso a contador.
  • Incremento del contador: Una vez que el mutex está bloqueado, se incrementa contador de manera segura.
  • mutex.Unlock(): La goroutine libera el mutex, permitiendo que otras goroutines lo adquieran.
  1. Uso de WaitGroup:
  • sync.WaitGroup se utiliza para esperar a que todas las goroutines terminen antes de imprimir el valor final de contador.
  1. Resultado Esperado:
  • Dado que mutex asegura que solo una goroutine puede modificar contador a la vez, el valor final será 1000, garantizando que no haya condiciones de carrera.

Salida esperada:

Valor final del contador: 1000Lenguaje del código: texto plano (plaintext)

Importancia del Uso de Mutexes

Sin el uso de mutexes, las goroutines podrían interferir entre sí, lo que resultaría en un valor incorrecto de contador. Este tipo de error, conocido como condición de carrera, ocurre cuando múltiples goroutines acceden y modifican un recurso compartido simultáneamente sin una adecuada sincronización.

Mutexes y Condiciones de Carrera

Para entender mejor cómo un mutex previene condiciones de carrera, considera el siguiente ejemplo sin sincronización:

package mainimport ( "fmt" "sync")var contador intfunc incrementar() { contador++}func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() incrementar() }() } wg.Wait() fmt.Println("Valor final del contador sin mutex:", contador)}Lenguaje del código: Go (go)

Explicación del Código:

  • En este caso, no se utiliza ningún mecanismo de sincronización, lo que significa que varias goroutines podrían estar intentando incrementar contador al mismo tiempo.
  • Resultado: El valor final de contador probablemente no será 1000 debido a las condiciones de carrera.

Salida esperada (puede variar):

Valor final del contador sin mutex: <valor_incorrecto>Lenguaje del código: texto plano (plaintext)

Este ejemplo demuestra la importancia de los mutexes para evitar condiciones de carrera y asegurar que los datos compartidos se modifiquen correctamente.

Bloqueo de Lectura/Escritura con sync.RWMutex

Go también proporciona un tipo RWMutex (Read-Write Mutex) que permite un mayor control sobre el acceso a los recursos. Con un RWMutex, múltiples goroutines pueden leer un recurso simultáneamente, pero solo una goroutine puede escribir en el recurso a la vez.

Ejemplo de Uso de RWMutex:

package mainimport ( "fmt" "sync")var contador intvar rwMutex sync.RWMutexfunc leerContador() int { rwMutex.RLock() // Bloqueo de lectura defer rwMutex.RUnlock() return contador}func incrementar() { rwMutex.Lock() // Bloqueo de escritura contador++ rwMutex.Unlock()}func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() incrementar() }() } wg.Wait() fmt.Println("Valor final del contador:", leerContador())}Lenguaje del código: Go (go)

Explicación del Código:

  1. rwMutex.RLock() y rwMutex.RUnlock(): Se utilizan para bloquear y desbloquear el mutex en modo lectura. Múltiples goroutines pueden ejecutar leerContador() simultáneamente sin bloquearse entre sí.
  2. rwMutex.Lock() y rwMutex.Unlock(): Se utilizan para bloquear y desbloquear el mutex en modo escritura, asegurando que solo una goroutine pueda modificar contador a la vez.

Salida esperada:

Valor final del contador: 1000Lenguaje del código: texto plano (plaintext)

Conclusión

Los mutexes en Go son esenciales para asegurar la integridad de los datos en aplicaciones concurrentes. Usando sync.Mutex y sync.RWMutex, puedes controlar cómo y cuándo las goroutines acceden a los recursos compartidos, evitando condiciones de carrera y otros problemas de sincronización.

Es crucial utilizar mutexes cuando múltiples goroutines necesitan leer o modificar datos compartidos para garantizar que el programa funcione de manera correcta y eficiente.

▷ Mutexes en Go → 【 Tutorial de Golang 】 (2024)

References

Top Articles
Kinder-marktkraam Kidkraft speelgoed kopen? | Lage prijzen
Merkwaarde creëren met het ‘Customer Based Brand Equity’-model van Keller - BOOM strategie en communicatie
UPS Paketshop: Filialen & Standorte
Phcs Medishare Provider Portal
Fort Carson Cif Phone Number
Overnight Cleaner Jobs
Marist Dining Hall Menu
Yi Asian Chinese Union
Victoria Secret Comenity Easy Pay
Rochester Ny Missed Connections
Craigslist Chautauqua Ny
Chastity Brainwash
Ssefth1203
‘Accused: Guilty Or Innocent?’: A&E Delivering Up-Close Look At Lives Of Those Accused Of Brutal Crimes
N2O4 Lewis Structure & Characteristics (13 Complete Facts)
History of Osceola County
Praew Phat
Itziar Atienza Bikini
TBM 910 | Turboprop Aircraft - DAHER TBM 960, TBM 910
Danforth's Port Jefferson
eHerkenning (eID) | KPN Zakelijk
Clare Briggs Guzman
Happy Life 365, Kelly Weekers | 9789021569444 | Boeken | bol
Bòlèt Florida Midi 30
All Obituaries | Verkuilen-Van Deurzen Family Funeral Home | Little Chute WI funeral home and cremation
Drying Cloths At A Hammam Crossword Clue
Delectable Birthday Dyes
Beaufort 72 Hour
Inter Miami Vs Fc Dallas Total Sportek
Dashboard Unt
Free T33N Leaks
Intel K vs KF vs F CPUs: What's the Difference?
Bayard Martensen
Stockton (California) – Travel guide at Wikivoyage
Salemhex ticket show3
Swimgs Yuzzle Wuzzle Yups Wits Sadie Plant Tune 3 Tabs Winnie The Pooh Halloween Bob The Builder Christmas Autumns Cow Dog Pig Tim Cook’s Birthday Buff Work It Out Wombats Pineview Playtime Chronicles Day Of The Dead The Alpha Baa Baa Twinkle
Fox And Friends Mega Morning Deals July 2022
Leland Nc Craigslist
One Credit Songs On Touchtunes 2022
AsROck Q1900B ITX und Ramverträglichkeit
Aliciabibs
Tillman Funeral Home Tallahassee
Nsav Investorshub
Fwpd Activity Log
Craigslist - Pets for Sale or Adoption in Hawley, PA
Hovia reveals top 4 feel-good wallpaper trends for 2024
Alston – Travel guide at Wikivoyage
Jamesbonchai
Rocket Lab hiring Integration &amp; Test Engineer I/II in Long Beach, CA | LinkedIn
Spurs Basketball Reference
Arre St Wv Srj
Guidance | GreenStar™ 3 2630 Display
Latest Posts
Article information

Author: Terrell Hackett

Last Updated:

Views: 5877

Rating: 4.1 / 5 (72 voted)

Reviews: 87% of readers found this page helpful

Author information

Name: Terrell Hackett

Birthday: 1992-03-17

Address: Suite 453 459 Gibson Squares, East Adriane, AK 71925-5692

Phone: +21811810803470

Job: Chief Representative

Hobby: Board games, Rock climbing, Ghost hunting, Origami, Kabaddi, Mushroom hunting, Gaming

Introduction: My name is Terrell Hackett, I am a gleaming, brainy, courageous, helpful, healthy, cooperative, graceful person who loves writing and wants to share my knowledge and understanding with you.