Race condition: el problema de depositar y retirar

2/19
Recursos

Aportes 4

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Este problema tambi茅n es conocido como 鈥淧roductor-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.
  • 鈥淎lgo鈥 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 鈥渁lgo鈥 que coordine el acceso a nuestra cuenta bancaria.

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())
}

Se vienen los problemas de concurrencia, vamos!

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.