Race condition: el problema de depositar y retirar

2/19
Recursos

Aportes 4

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Este problema también es conocido como “Productor-Consumidor”. Donde existen los principales involucrados:

  • Los productores: crean tareas y las ponen en un buffer compartido.
  • Los consumidores: sacan las tareas que el productor puso en el buffer compartido.
  • Buffer compartido: a través de este los productores y consumidores se comunican/envían tareas.
  • “Algo” que coordine el acceso al buffer; mejor conocidos como semáforos o mutex. Evitan que ocurra la condición de competencia (Race condition) por acceder al buffer.

En el ejemplo de Néstor:

  • Los productores: son nuestros depósitos.
  • Los consumidores: son nuestros retiros.
  • El buffer: Será nuestra cuenta bancaria.

Para evitar que algunos retiros o depósitos no se marquen o se marquen doble, necesitamos “algo” que coordine el acceso a nuestra cuenta bancaria.

Se vienen los problemas de concurrencia, vamos!

Hice este ejemplo con un wait group 😄

package main

import (
	"fmt"
	"sync"
)

var balance int

func Deposit(amount int, wg *sync.WaitGroup) {
	defer wg.Done()
	balance = balance + amount
	fmt.Println("Deposited", amount)
}

func Withdraw(amount int, wg *sync.WaitGroup) bool {
	defer wg.Done()

	// Wait a second to simulate a delay
	//time.Sleep(time.Millisecond)

	if amount > balance {
		fmt.Println("Insufficient funds")
		return false
	}
	balance = balance - amount
	return true
}

func Balance() int {
	return balance
}

func main() {
	var wg sync.WaitGroup

	balance = 500
	wg.Add(2)
	go Deposit(200, &wg)
	go Withdraw(700, &wg)

	wg.Wait()
	fmt.Println(Balance())
}

Siempre he creído que poner por defecto los Aportes y Preguntas en esta sección solo generan distracción en el alumno. Creo que debería ser opcional y si alguien los quiere mirar que sea por acción propia.