добавление нескольких массивов в несколько потоков для добавления - PullRequest
0 голосов
/ 29 октября 2019

У меня есть простой Компьютер класс с 3 полями и Компьютеры класс, который имеет массив Computer [] и метод sortedAdd, который добавляет элементы во внутренний массив отсортированным образом.

В основном методе у меня есть массив computers , в котором есть все записи из файлов, которые я прочитал, и переменная results , в которую я пытаюсь добавить все записи, перебираякаждый Компьютеры объект класса в компьютеры * массив 1014 *.

В основном методе я хочу запустить выбранное количество потоков (2 <= количество <= 7) - что будетпереберите все имеющиеся у меня записи и добавьте каждую из них в результаты. Мой класс Компьютеры также должен быть поточно-ориентированным. </p>

Я пробовал это, и это, кажется, работает, но только если я использую 3 потока (это очевидно, потому что я назначаю один поток одному Компьютеру). объект).

    public class Computers
    {
        public Computer[] _computers; //stores 'Computer' class objects.

        private readonly object _locker;
        public int _count { get; private set; } //element in array count

        public Computers(int length)
        {
            _locker = new object();
            _count = 0;
            _computers = new Computer[length];
        }

        public void sortedAdd(Computer computer)
        {
            lock (_locker)
            {
                int indexToinsert = findIndex(computer); // find a spot where element should be added
                if (indexToinsert == 0 && _count == 0 || indexToinsert == _count)
                {
                    _computers[indexToinsert] = computer;
                    _count++;
                }
                else
                {   //free up space for the element to be added.
                    for (int i = _count; i > indexToinsert; i--)
                    {
                        _computers[i] = _computers[i - 1];
                    }
                    _computers[indexToinsert] = computer;
                    _count++;
                }
                Monitor.Pulse(_locker);
            }

        }

        public int findIndex(Computer computer)
        {

            if (_count == 0)
                return 0;
            for (int i = 0; i < _count; i++)
            {
                if (computer.CompareTo(_computers[i]) <= 0)
                {
                    return i;
                }
            }
            return _count;
        }
    }

    static void Main(string[] args)
    {
        Computers[] computers = new Computers[3]; //data stored from 3 files.
        Computers results = new Computers(90); // will store all elements here.

        for (int i = 0; i < 3; i++)
            computers[i] = ReadToArray(); //each Computers object's array Computer[] is populated with 30 records.




        // --- now we take each element and add it to results.
        var threadsAdd = Enumerable.Range(0, 3).Select(i => new Thread(() =>
        {
            for (int j = 0; j < computers[i]._computers.Length; j++)
            {
                results.sortedAdd(computers[i]._computers[j]);
            }
        }));

        var threads = threadsAdd.ToList();

        foreach (var thread in threads)
        {
            thread.Start();
        }
        // wait for all threads to finish
        foreach (var thread in threads)
        {
            thread.Join();
        }
    }

Как мне сделать то же самое, но с .. например 2, 4 или 5 нитями вместо? Также мой поток компьютеров безопасен для потока?

Редактировать: Мне нужно использовать класс Thread специально и не разрешено использовать коллекции потока безопасности

...