diff --git a/Multithreading/Multithreading/Asyncs.cs b/Multithreading/Multithreading/Asyncs.cs new file mode 100644 index 0000000..41e15c5 --- /dev/null +++ b/Multithreading/Multithreading/Asyncs.cs @@ -0,0 +1,106 @@ +// using System; +// using System.Threading; +// using System.Threading.Tasks; +// +// namespace Multithreading +// { +// internal class Program +// { +// public static void Main(string[] args) +// { +// Console.WriteLine("Program started"); +// +// Console.WriteLine($"Entering Main Thread: {Thread.CurrentThread.ManagedThreadId}"); +// +// // Task randomNumberTask = Task.Run(() => +// // { +// // Console.WriteLine($"Entering Thread: {Thread.CurrentThread.ManagedThreadId}"); +// // Random random = new Random(); +// // return random.Next(); +// // }); +// // +// // randomNumberTask.Wait(); +// // int randomNumber = randomNumberTask.Result; +// // Console.WriteLine($"Random number: {randomNumber}"); +// +// // only works in an async method +// // Task randomNumberTask2 = Task.Run(() => +// // { +// // Console.WriteLine($"Entering Thread: {Thread.CurrentThread.ManagedThreadId}"); +// // Random random = new Random(); +// // return random.Next(); +// // }); +// // +// // int randomNumber2 = await randomNumberTask2; +// // Console.WriteLine($"Random number: {randomNumber2}"); +// +// // GetRandomNumber().Wait(); +// +// // for (int i = 0; i < 10; i++) +// // { +// // SleepForAWhile(i).Wait(); +// // } +// +// Task[] sleepTasks = new Task[10]; +// for (int i = 0; i < 10; i++) +// { +// sleepTasks[i] = SleepForAWhile(i); +// } +// +// Task.WaitAll(sleepTasks); +// +// // Thread[] sleepThreads = new Thread[10]; +// // for (int i = 0; i < 10; i++) +// // { +// // sleepThreads[i] = new Thread(SleepForAWhileThread); +// // sleepThreads[i].Start(i); +// // } +// // +// // for (int i = 0; i < 10; i++) +// // { +// // sleepThreads[i].Join(); +// // } +// +// Console.WriteLine("Program ended"); +// } +// +// private static async Task GetRandomNumber() +// { +// Console.WriteLine($"GetRandomNumber Thread: {Thread.CurrentThread.ManagedThreadId}"); +// +// Task randomNumberTask = Task.Run(() => +// { +// Console.WriteLine($"GetRandomNumber Task: {Thread.CurrentThread.ManagedThreadId}"); +// Random random = new Random(); +// return random.Next(); +// }); +// +// return await randomNumberTask; +// } +// +// private static async Task SleepForAWhile(int id) +// { +// Console.WriteLine($"SleepForAWhile in {Thread.CurrentThread.ManagedThreadId} for {id}"); +// // await Task.Delay(TimeSpan.FromSeconds(1)); +// // await Task.Run(() => Thread.Sleep(1000)); +// Thread.Sleep(1000); +// Console.WriteLine($"SleptForAWhile in {Thread.CurrentThread.ManagedThreadId} for {id}"); +// +// int randomNumber = await GetRandomNumber(); +// Console.WriteLine($"randomNumber ({randomNumber}) in {Thread.CurrentThread.ManagedThreadId} for {id}"); +// } +// +// private static void SleepForAWhileThread(object? id) +// { +// Console.WriteLine($"SleepForAWhileThread in {Thread.CurrentThread.ManagedThreadId} for {id}"); +// Thread.Sleep(1000); +// Console.WriteLine($"SleptForAWhileThread in {Thread.CurrentThread.ManagedThreadId} for {id}"); +// +// Task getRandomNumberTask = GetRandomNumber(); +// getRandomNumberTask.Wait(); +// int randomNumber = getRandomNumberTask.Result; +// Console.WriteLine($"randomNumber ({randomNumber}) in {Thread.CurrentThread.ManagedThreadId} for {id}"); +// } +// } +// } +// diff --git a/Multithreading/Multithreading/RaceConditions.cs b/Multithreading/Multithreading/RaceConditions.cs new file mode 100644 index 0000000..15e425e --- /dev/null +++ b/Multithreading/Multithreading/RaceConditions.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Multithreading +{ + internal class Program + { + private static object _fileHandleLock = new object(); + + public static void Main(string[] args) + { + Console.WriteLine("Program started"); + + // int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + // Task[] tasks = new Task[10]; + // Random random = new Random(); + // for (int i = 0; i < tasks.Length; i++) + // { + // tasks[i] = Task.Run(() => + // { + // Console.WriteLine($"Start Task {Thread.CurrentThread.ManagedThreadId}"); + // + // for (int j = 0; j < 10; j++) + // { + // int index = random.Next(0, numbers.Length); + // Console.WriteLine( + // $"Before Random number {numbers[index]} in {Thread.CurrentThread.ManagedThreadId} with index {index}"); + // // Thread.Sleep(random.Next(10, 100)); + // numbers[index] = random.Next(); + // // Thread.Sleep(random.Next(10, 100)); + // Console.WriteLine( + // $"After Random number {numbers[index]} in {Thread.CurrentThread.ManagedThreadId}"); + // + // lock (_fileHandleLock) + // { + // // File.AppendAllText("output.txt", $"{Thread.CurrentThread.ManagedThreadId}: {numbers[index]}\n"); + // FileStream fs = File.OpenWrite("output.txt"); + // string s = $"{Thread.CurrentThread.ManagedThreadId}: {numbers[index]}\n"; + // byte[] bytes = Encoding.UTF8.GetBytes(s); + // fs.Write(bytes, 0, bytes.Length); + // fs.Close(); + // fs.Dispose(); + // } + // } + // + // Console.WriteLine($"Finished Task {Thread.CurrentThread.ManagedThreadId}"); + // }); + // } + // + // Task.WaitAll(tasks); + + Dictionary dictionary = new Dictionary(); + Task[] dictionaryTasks = new Task[1000]; + Random random2 = new Random(); + for (int i = 0; i < dictionaryTasks.Length; i++) + { + dictionaryTasks[i] = Task.Run(() => + { + Thread.Sleep(100); + lock (dictionary) // option 2 + { + int key = random2.Next(); + if (!dictionary.ContainsKey(key)) + { + dictionary.Add(key, $"Key {key}"); + // dictionary.TryAdd(key, $"Key {key}"); // option 1 + } + } + }); + } + + Task.WaitAll(dictionaryTasks); + + Console.WriteLine("Program ended"); + } + } +} \ No newline at end of file diff --git a/Multithreading/Multithreading/Tasks.cs b/Multithreading/Multithreading/Tasks.cs index 055a031..c957630 100644 --- a/Multithreading/Multithreading/Tasks.cs +++ b/Multithreading/Multithreading/Tasks.cs @@ -1,127 +1,135 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Multithreading -{ - internal class Program - { - public static void Main(string[] args) - { - Console.WriteLine("Program started"); - - // Task task = new Task(() => - // { - // for (int i = 0; i < 10; i++) - // { - // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); - // Thread.Sleep(500); - // } - // }); - // task.Start(); - // - // Task task2 = Task.Run(() => - // { - // for (int i = 0; i < 10; i++) - // { - // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); - // Thread.Sleep(500); - // } - // }); - // - // task.Wait(); - // task2.Wait(); - // - // Task task3 = new Task(() => - // { - // for (int i = 0; i < 10; i++) - // { - // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); - // Thread.Sleep(500); - // } - // }); - // task3.RunSynchronously(); - - // CancellationTokenSource cts = new CancellationTokenSource(); - // CancellationToken token = cts.Token; - // - // Task task4 = Task.Run(() => - // { - // for (int i = 0; i < 10; i++) - // { - // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); - // Thread.Sleep(500); - // - // // token.ThrowIfCancellationRequested(); - // if (token.IsCancellationRequested) - // { - // // throw new TaskCanceledException(); - // break; - // } - // } - // }, token); - // - // ConsoleKeyInfo keyInfo = Console.ReadKey(); - // if (keyInfo.Key == ConsoleKey.A) cts.Cancel(); - // - // try - // { - // task4.Wait(token); - // } - // catch (OperationCanceledException e) - // { - // Console.WriteLine(e); - // } - // - // cts.Dispose(); - - // CancellationTokenSource cts2 = new CancellationTokenSource(); - Random random = new Random(); - Task[] tasks = new Task[10]; - for (int i = 0; i < tasks.Length; i++) - { - tasks[i] = Task.Run(() => - { - Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) started"); - for (int j = 0; j < 10; j++) - { - Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {j}"); - Thread.Sleep(random.Next(100, 1000)); - - if (random.NextSingle() > 0.9f) - { - Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) aborted"); - // cts2.Cancel(); - throw new OperationCanceledException(); - } - } - - Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) ended"); - }); - Console.WriteLine($"Task with id {tasks[i].Id} created"); - Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}"); - } - - try - { - Task.WaitAll(tasks); - // Task.WaitAny(tasks); - } - catch (OperationCanceledException) - { - Console.WriteLine("Operation was canceled"); - } - catch (AggregateException) - { - Console.WriteLine("One or more tasks canceled"); - } - - for (int i = 0; i < tasks.Length; i++) - { - Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}"); - } - - Console.WriteLine("Program ended"); - } - } -} \ No newline at end of file +// using System; +// using System.Threading; +// using System.Threading.Tasks; +// +// namespace Multithreading +// { +// internal class Program +// { +// public static void Main(string[] args) +// { +// Console.WriteLine("Program started"); +// +// // Task task = new Task(() => +// // { +// // for (int i = 0; i < 10; i++) +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); +// // Thread.Sleep(500); +// // } +// // }); +// // task.Start(); +// // +// // Task task2 = Task.Run(() => +// // { +// // for (int i = 0; i < 10; i++) +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); +// // Thread.Sleep(500); +// // } +// // }); +// // +// // task.Wait(); +// // task2.Wait(); +// // +// // Task task3 = new Task(() => +// // { +// // for (int i = 0; i < 10; i++) +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); +// // Thread.Sleep(500); +// // } +// // }); +// // task3.RunSynchronously(); +// +// // CancellationTokenSource cts = new CancellationTokenSource(); +// // CancellationToken token = cts.Token; +// // +// // Task task4 = Task.Run(() => +// // { +// // for (int i = 0; i < 10; i++) +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); +// // Thread.Sleep(500); +// // +// // // token.ThrowIfCancellationRequested(); +// // if (token.IsCancellationRequested) +// // { +// // // throw new TaskCanceledException(); +// // break; +// // } +// // } +// // }, token); +// // +// // ConsoleKeyInfo keyInfo = Console.ReadKey(); +// // if (keyInfo.Key == ConsoleKey.A) cts.Cancel(); +// // +// // try +// // { +// // task4.Wait(token); +// // } +// // catch (OperationCanceledException e) +// // { +// // Console.WriteLine(e); +// // } +// // +// // cts.Dispose(); +// +// // CancellationTokenSource cts2 = new CancellationTokenSource(); +// // Random random = new Random(); +// // Task[] tasks = new Task[10]; +// // for (int i = 0; i < tasks.Length; i++) +// // { +// // tasks[i] = Task.Run(() => +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) started"); +// // for (int j = 0; j < 10; j++) +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {j}"); +// // Thread.Sleep(random.Next(100, 1000)); +// // +// // if (random.NextSingle() > 0.9f) +// // { +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) aborted"); +// // cts2.Cancel(); +// // // throw new OperationCanceledException(); +// // } +// // +// // cts2.Token.ThrowIfCancellationRequested(); +// // } +// // +// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) ended"); +// // }, cts2.Token); +// // Console.WriteLine($"Task with id {tasks[i].Id} created"); +// // Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}"); +// // } +// // +// // try +// // { +// // Task.WaitAll(tasks, cts2.Token); +// // // Task.WaitAny(tasks); +// // } +// // catch (OperationCanceledException) +// // { +// // Console.WriteLine("Operation was canceled"); +// // } +// // catch (AggregateException) +// // { +// // Console.WriteLine("One or more tasks canceled"); +// // } +// // +// // for (int i = 0; i < tasks.Length; i++) +// // { +// // Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}"); +// // } +// +// Parallel.For(0, 10000, i => +// { +// // doing some heavy calculation +// Console.WriteLine($"Thread ({Thread.CurrentThread.ManagedThreadId}): {i}"); +// }); +// +// Console.WriteLine("Program ended"); +// } +// } +// } \ No newline at end of file