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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы