Не могу разобраться с работой потоков - C#
Формулировка задачи:
Сейчас изучаю работу потокв в C#
Для меня основная польза от потоков - что можно работать быстрее,допустим чекер работает в 5 потоков в 5 раз быстрее и т.д
Но я не мону разобраться с кое с чем.Допустим напишем простую программу,которая выводит в цикле числа до 500
Тогда программа будем выводить
Я вроде как заблокировал через lock доступ,но один поток как бы не видит другой и работа не распределяеться
тоесть надо чтобы первый поток выводил 1,а второй уже 2 и т.д я думаю мысль понятна,но не могу понять как это сделать
class Program { static object threadLockers = new object(); static void Main() { Thread t1 = new Thread(Func); //1 шаг - обьявляем поток t1.Start(); //2 шаг - запускам поток Thread t2 = new Thread(Func); t2.Start(); } static void Func() { for (int i = 1; i < 501; i++) { lock(threadLockers) { Console.WriteLine(i); Thread.Sleep(100); } } Console.ReadLine(); } }
1 1 2 2 3 3 и т.д
Решение задачи: «Не могу разобраться с работой потоков»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication143 { internal class Program { private static void Main() { const int n = 5; ThreadStart start = () => { for (int i = 0; i < n; i++) Console.WriteLine("{0} {1}", i, Thread.CurrentThread.ManagedThreadId); }; var rrs = new RobinRoundSheduler(2, start) {TimeForTask = new TimeSpan(1)}; rrs.Start(); Console.ReadKey(); } } internal class RobinRoundSheduler { private readonly LinkedList<Thread> _threads; public TimeSpan TimeForTask { get; set; } public RobinRoundSheduler(int taskCount, ThreadStart start) { TimeForTask = TimeSpan.FromSeconds(1); _threads = new LinkedList<Thread>(); for (int i = 0; i < taskCount; i++) { _threads.AddLast(new Thread(start)); } } public void Start() { while (_threads.Count > 0) { var list = new List<Thread>(); foreach (var thread in _threads) { lock (thread) { if (thread.ThreadState == ThreadState.Unstarted) thread.Start(); else thread.Resume(); } thread.Join(TimeForTask); lock (thread) { if (thread.ThreadState == ThreadState.Stopped || thread.ThreadState == ThreadState.Aborted) list.Add(thread); else { thread.Suspend(); } } } list.ForEach(thread => _threads.Remove(thread)); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д