Как сделать так, чтобы каждый поток работал с отдельным элементом массива - 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;
}
}