Witam, ćwiczę sobie programowanie równoległe i napotkałem takie zadanie:
Korzystając z ManualResetEventSlim, przygotuj program, w którym dwa wątki przekazują sobie "pałeczkę" uprawniającą je do działania. Przy uruchomieniu aplikacji włączy się pierwszy wątek; drugi czeka. Po sekundzie pierwszy wątek wstrzymuje działanie i daje kontrole drugiemu wątkowi. Po kolejnej sekundzie drugi wątek wstrzymuje działanie i daje sygnał do działania pierwszemu wątkowi. I tak aż do momentu, w którym użytkownik zakończy program.
Wszystko pięknie działa jak dodam thread.Sleep(1000) przed Console.WriteLine. Problem mam natomiast jak usunę Thread.Sleep. Pojawia się zakleszczenie i program losowo po "n" rundzie przestaje działać. Jakieś pomysły ?
using System;
using System.Threading;
namespace ManualResetEventSlimExample
{
public class Program
{
public static void Main(string[] args)
{
ManualResetEvent threadOneController = new ManualResetEvent(true);
ManualResetEvent threadTwoController = new ManualResetEvent(false);
ThreadStart action1 = new ThreadStart(() =>
{
while (true)
{
threadOneController.WaitOne();
Thread.Sleep(0);
Console.WriteLine("{0} --- Thread 1 is doing some actions", DateTime.Now);
threadTwoController.Set();
threadTwoController.Reset();
threadOneController.Reset();
}
});
ThreadStart action2 = new ThreadStart(() =>
{
while (true)
{
threadTwoController.WaitOne();
Thread.Sleep(0);
Console.WriteLine("{0} --- Thread 2 is doing some actions", DateTime.Now);
threadOneController.Set();
threadOneController.Reset();
threadTwoController.Reset();
}
});
var t1 = new Thread(action1);
var t2 = new Thread(action2);
t1.Start();
t2.Start();
}
}
}