Que bueno, justo hice un examen en la universidad ayer sobre threads y procesos donde era necesaria la sincronización con, mutex, semaphors y monitors, también entraba la parte de comunicación entre procesos!
Buena explicación, una duda la excepción no ocurrió porque entraron al mutex pero como no habían más enteros que descontar no entro al if y termino la ejecución sin ejecutar el mutex reléase?
Hola, si se hiciera la release del mutex después del "if" no sería necesario utilizar try-catch, ¿correcto?, al final siempre vamos a querer liberar el mutex.
Muy buena explicación, solo tengo una duda. Estás utilizando un try-catch para la toma de decisiones. En la documentación veo que hay un campo WaitTimeout y un ejemplo " if(mut.WaitOne(1000))" ¿No sería mejor alternativa? Pregunto por que no estoy seguro del caso. El WaitOne recibe un TimeSpan o el tiempo en ms como Int32. Un saludo y gracias por el vídeo, no conocía esto del Mutex, había usado semáforos como SemaphoreSlim y Semaprhore pero el Mutex tiene claramente otro contexto y ventajas en su contexto específico.
Que interesante, consulta esta forma de aplicación Mutex deberá tener en eBay cuando se realiza subasta y hay muchos participantes? O en las web de compras y hay muchos conectados no?
Gracias carnal por compartir conocimiento... Me surge una duda y quería preguntarte cual crees que sea la mejor práctica... Resulta que tengo que consumir un SP que bloquea tablas (En un FilesystemWatcher y mando como parámetro el nombre del fichero para que SQL lo procese...) pero pues si detectan más de 2 eventos a la vez... Me da un error de deadlocked on lock... Crees que así con Mutex sería la mejor práctica? o me podrías sugerir alguna alternativa mejor??? Gracias de antemano y gracias de nuevo por todo!!!!
Hola Héctor se me ocurrió esto, pensando en una clase que contenga un metodo static al cual se le cuele cualquiera que quiera: public class Person { public Cake _Cake; public string _name; public Mutex _mutex; public Person(Cake cake,string name, Mutex mutex) { _Cake = cake; _name = name; _mutex = mutex; } } public class ComerPastel { public static void Bite(object Persona) // 0) // Comprueba antes de entrar al bucle si _persona no es null y si hay Porciones. { try { _persona._mutex.WaitOne(); // Si ya hay un hilo en el proceso hace esperar al que esta queriendo acceder a este. if (_persona._Cake.GetQuantity() > 0) // Ahora hacemos otra comprobacion para el proceso que quedo esperando, par comprobar que el ultimo proceso que paso se halla acabado el pastel. { Console.WriteLine($"{_persona._name} le muerde al pastel {_persona._Cake.GetQuantity()}"); _persona._Cake.BiteMe(); // Morder el pastel Console.WriteLine($"{_persona._name} lo deja en {_persona._Cake.GetQuantity()}"); _persona._mutex.ReleaseMutex(); } } catch (AbandonedMutexException ex) { Console.WriteLine($"Lamentablemente ya no hay pastel {_persona._name}"); } } } } ==== Y en Program: ======= Mutex mut = new(); var MyCake = new Cake(100); var p1 = new Person(MyCake, "Hector", mut); var p2 = new Person(MyCake, "Rosana", mut); var p3 = new Person(MyCake, "Javier", mut); var p4 = new Person(MyCake, "Marco", mut); var p5 = new Person(MyCake, "Roberto", mut); string UnHola = "Hola"; // En este caso no hara nada porque no es un objeto Person que se requiere en el metodo Bite. var thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(UnHola ); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p2); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p3); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p4); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p5); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p1); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p3); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p5); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p4); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p5); thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite)); thread.Start(p1);
Regístrate y encuentra trabajo en Lemon: l.lemon.io/hdeleon
Mis cursos: hdeleon.net/cursos-premium/
Que bueno, justo hice un examen en la universidad ayer sobre threads y procesos donde era necesaria la sincronización con, mutex, semaphors y monitors, también entraba la parte de comunicación entre procesos!
Termine de ver el video hermano, excelente herramienta.
No puedes poner mutex fuera del while para protegerlo y ahorrar el if ?
Un crack, a quien más se le entiende así de claro sino a Héctor; Me hubiera gustado más con cervezas y sorbos de cerveza
Muy buen video.. Estaria bueno otro explicando con un recurso de una base de datos. Muchas gracias
Buena explicación, una duda la excepción no ocurrió porque entraron al mutex pero como no habían más enteros que descontar no entro al if y termino la ejecución sin ejecutar el mutex reléase?
Esto mismo estaba pensando, esperaba que libere el mutex después del if en lugar de colocar una excepción, pero tampoco soy muy experto en esto
muy bueno hector, todos los dias se aprende algo nuevo con tus videos
Que bien que esta vez hubieron pastel en la fiesta y no cervezas 😁. Excelentes videos como siempre hermano
Excelente aporte, gracias Héctor.
Muy bueno Héctor, muchas gracias por este nuevo video! Un tema muy importante en el que tengo que profundizar
Hola, Héctor. ¿Se puede usar Mutex con operaciones asincronas?
Simplemente un crack gracias por compartir tus conocimiento Héctor
Excelente video, pero cual es la diferencia con el lock, o el semáforo?
Que diferencia hay entre usar la instancia mutex y lock o Semaphore?
Pensé que ibas a explicar Lock también 😂. Aunque me ha parecido un excelente video 😌
Muchas gracias, lo explicas superbien, cual es la ventaja de mutex sobre lock
Que fácil que lo transmitis, el concepto lo entendi a la perfección, muchas gracias por tu contenido :3
excelente video
Buen video, se entendió perfecto. Consulta, las zonas críticas con qué otro objeto se pueden administrar aparte de los Threads?
Buena info lo malo es que odio C# pero se entiende para hacerlo en c++ nativo
Excelente! muy bien explicado!
Hola, si se hiciera la release del mutex después del "if" no sería necesario utilizar try-catch, ¿correcto?, al final siempre vamos a querer liberar el mutex.
increible la explicacion. siempre enseñando de primera Hector 🤟
Excelente info!! 🍺
Muy buena explicación, solo tengo una duda. Estás utilizando un try-catch para la toma de decisiones. En la documentación veo que hay un campo WaitTimeout y un ejemplo " if(mut.WaitOne(1000))" ¿No sería mejor alternativa? Pregunto por que no estoy seguro del caso. El WaitOne recibe un TimeSpan o el tiempo en ms como Int32.
Un saludo y gracias por el vídeo, no conocía esto del Mutex, había usado semáforos como SemaphoreSlim y Semaprhore pero el Mutex tiene claramente otro contexto y ventajas en su contexto específico.
Cual es la diferencia entre el hilo y el task?
Que interesante, consulta esta forma de aplicación Mutex deberá tener en eBay cuando se realiza subasta y hay muchos participantes? O en las web de compras y hay muchos conectados no?
Gracias carnal por compartir conocimiento... Me surge una duda y quería preguntarte cual crees que sea la mejor práctica... Resulta que tengo que consumir un SP que bloquea tablas (En un FilesystemWatcher y mando como parámetro el nombre del fichero para que SQL lo procese...) pero pues si detectan más de 2 eventos a la vez... Me da un error de deadlocked on lock... Crees que así con Mutex sería la mejor práctica? o me podrías sugerir alguna alternativa mejor??? Gracias de antemano y gracias de nuevo por todo!!!!
Existe stack overflow
El primero en verte!!! Genio!!!!
También seria una buena idea mostrar lock y semáforos para la concurrencia, buen video 🤘
🤘
Hola Héctor se me ocurrió esto, pensando en una clase que contenga un metodo static al cual se le cuele cualquiera que quiera:
public class Person
{
public Cake _Cake;
public string _name;
public Mutex _mutex;
public Person(Cake cake,string name, Mutex mutex)
{
_Cake = cake;
_name = name;
_mutex = mutex;
}
}
public class ComerPastel
{
public static void Bite(object Persona) // 0) // Comprueba antes de entrar al bucle si _persona no es null y si hay Porciones.
{
try
{
_persona._mutex.WaitOne(); // Si ya hay un hilo en el proceso hace esperar al que esta queriendo acceder a este.
if (_persona._Cake.GetQuantity() > 0) // Ahora hacemos otra comprobacion para el proceso que quedo esperando, par comprobar que el ultimo proceso que paso se halla acabado el pastel.
{
Console.WriteLine($"{_persona._name} le muerde al pastel {_persona._Cake.GetQuantity()}");
_persona._Cake.BiteMe(); // Morder el pastel
Console.WriteLine($"{_persona._name} lo deja en {_persona._Cake.GetQuantity()}");
_persona._mutex.ReleaseMutex();
}
}
catch (AbandonedMutexException ex)
{
Console.WriteLine($"Lamentablemente ya no hay pastel {_persona._name}");
}
}
}
}
==== Y en Program: =======
Mutex mut = new();
var MyCake = new Cake(100);
var p1 = new Person(MyCake, "Hector", mut);
var p2 = new Person(MyCake, "Rosana", mut);
var p3 = new Person(MyCake, "Javier", mut);
var p4 = new Person(MyCake, "Marco", mut);
var p5 = new Person(MyCake, "Roberto", mut);
string UnHola = "Hola"; // En este caso no hara nada porque no es un objeto Person que se requiere en el metodo Bite.
var thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(UnHola );
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p2);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p3);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p4);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p5);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p1);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p3);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p5);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p4);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p5);
thread = new Thread(new ParameterizedThreadStart(ComerPastel.Bite));
thread.Start(p1);
Aun sigo sin entender, se supone que en concurrencia solo hay un hilo ejecutandose al mismo tiempo.. porque usar Mutex?
Eso no es concurrencia.
estoy seguro ese lomito programa mejor que varios que conozco 🤣🤣
Pasa el wallp pls
verga que cosa mas confusa xd
Muy básico => muy primitivo
excelente video