Как сделать так, чтобы каждый поток работал с отдельным элементом массива - C#
Формулировка задачи:
н-ое количество потоков (в данном случае 3) выполняют операцию с массивом. Как сделать так, чтобы каждый поток работал с отдельным элементом массива. Первый поток работает с первым элементом, второй со вторым, третий с третьим, закончив работу с первым элементом, первый поток уже переходит к 4, второй к 5 и тд. То есть чтобы каждый поток увеличил отдельный элемент массива на 1 и другой поток уже этот элемент не трогал.
class Program { static void Main(string[] args) { for (int i = 0; i < 3; i++) { new Thread(new ThreadStart(Action1)).Start(); } Console.ReadKey(); } public static void Action1() { int[] p = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i< p.Length; i++) { p[i]++; Console.WriteLine(p[i]); } } }
Решение задачи: «Как сделать так, чтобы каждый поток работал с отдельным элементом массива»
textual
Листинг программы
void Main() { var info = new AddInfo( new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ); for (int i = 0; i < 3; i++) { new Thread(Action1).Start(info); } } public static void Action1(object data) { var info = (AddInfo)data; int idx; while (info.GetCurrentIndex(out idx)) { info.Numbers[idx]++; } } class AddInfo { private volatile int _currentIndex; public int[] Numbers { get; private set; } public AddInfo(int[] numbers) { Numbers = numbers; _currentIndex = -1; } public bool GetCurrentIndex(out int index) { index = -1; if (_currentIndex >= Numbers.Length) return false; int temp = Interlocked.Add(ref _currentIndex, 1); if (temp < Numbers.Length) { index = temp; return true; } return false; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д