Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240

Поиск чисел в массиве в многопоточном режиме

05.02.2015, 22:44. Показов 3516. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу, она ищет среди массива рандомных чисел 1 число с помощью двух потоков и в лоб(перебором), но почему-то потоки не работают вместе, почему это так. Заранее спасибо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
// using System.Threading.Tasks;
 
namespace TwoTreads
{
    class Program
    {
        private double[] mas;
        private double a;
        private int i, j;
        private bool stopTread;
        private ThreadStart myThreadDelegate;
        private Thread thr;
        public Program(double[] ar, double chys)
        {
            a = chys;
            mas = new double[10000000];
            mas = ar;
            stopTread = false;
        }
        public void SearchThread()
        {
            Console.WriteLine("Поток 1 запущен"); 
            for (i = 0; i < 500000; i++)
            {
                if (stopTread == true)
                    break;
                //else
                    if (mas[i] == a)
                    {
                        stopTread = true;
                        Console.WriteLine("Число {0} найдено под номером {1}", a, i);
                    }
                //    Thread.Sleep(500);
            }
        }
 
        public void SearchThread1()
        {
            Console.WriteLine("Поток 2 запущен");
            for (j = 10000000; j > 500000; j--)
            {
                if (stopTread == true)
                   break;
                //else
                    if (mas[i] == a)
                    {
                        stopTread = true;
                        Console.WriteLine("Число {0} найдено под номером {1}", a, j);
                    }
                   // Thread.Sleep(500);
            }
        }
        public void go()
        {
            ThreadStart myThreadDelegate = new ThreadStart(SearchThread);
            Thread thr = new Thread(myThreadDelegate);
            thr.Start();
        }
        public void go1()
        {
            ThreadStart myThreadDelegate = new ThreadStart(SearchThread1);
            Thread thr = new Thread(myThreadDelegate);
             thr.Start();
        }
    }
    class TwoTreadsApp
    {
        [STAThread]
        static void Main(string[] args)
        {
            double[] arr;
            double k;
            Random rand = new Random();
            arr = new double[10000000];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = Convert.ToDouble(rand.Next(10000)) / 100;
             //   Console.WriteLine("{0}", arr[i]);
            }
            Console.WriteLine("Введите число для поиска");
            k = double.Parse(Console.ReadLine());
            Program sw1 = new Program(arr, k);
            Program sw2 = new Program(arr, k);
            var sw = System.Diagnostics.Stopwatch.StartNew();
            var sw3 = System.Diagnostics.Stopwatch.StartNew();
            //  Array.Sort(arr);
            sw1.go();
            Thread.Sleep(250);
            sw2.go1();
            //if (Program.stopTread == true)
            sw.Stop();
            Console.WriteLine("затрачено времени:{0}", sw.Elapsed);
          /*  for (int i = 0; i < arr.Length; i++)
                if (arr[i] == k)
                {
                    break;
                    sw3.Stop();
                    Console.WriteLine("Число {0} найдено под номером {1}", k, i);
                    Console.WriteLine("затрачено времени:{0}", sw3.Elapsed);
                }*/
            Console.ReadKey();
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2015, 22:44
Ответы с готовыми решениями:

Зависание окна в многопоточном режиме
Карочи есть проблема. Этот код работает нормально (текст меняется, прогрессбар заполняется, с формой можно делать всё что взбредет в...

обход папок в многопоточном режиме
Помогите реализовать данный код в многопоточном режиме. Заранее спасибо. Я не особо понимаю в чем ошибки, проверьте пожалуйста. inline...

Выполнение фоновых задач в многопоточном режиме
Здравствуйте, возник вопрос с многопотоковостью в ASP.MVC приложении. Есть задачи которые необходимо выполнять в фоновом режиме в разных...

22
91 / 91 / 44
Регистрация: 20.04.2008
Сообщений: 331
06.02.2015, 08:42
2 потока не могут одновременно обращаться к одному объекту
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 18:22  [ТС]
Тоесть мне надо обьязательно разбить массив?

Добавлено через 5 минут
...
C#
1
2
3
4
5
6
7
8
9
10
 for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = Convert.ToDouble(rand.Next(10000)) / 100;
                arr1[i] = arr[i];
                //   Console.WriteLine("{0}", arr[i]);
            }
            Console.WriteLine("Введите число для поиска");
            k = double.Parse(Console.ReadLine());
            Program sw1 = new Program(arr, k);
            Program sw2 = new Program(arr1, k);
...

Добавлено через 1 минуту
Всеравно не хочет
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 18:23
Цитата Сообщение от off Посмотреть сообщение
2 потока не могут одновременно обращаться к одному объекту
Это не так.
Цитата Сообщение от Mansu Посмотреть сообщение
почему-то потоки не работают вместе, почему это так
А как вы опредилили что они не работают вместе? Они работают вместе. Просто там так все быстро происходит, что первый поток все успевает вычислить пока включается второй. Тем более вы поставили задержку между ними.
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 18:50  [ТС]
Ну я почему-то отключаю первый, а второй не находит ничего

Добавлено через 49 секунд
А off ошибался, я понял, я ж не защищал поток, так что может с одним обьектом работать кучу их

Добавлено через 7 минут
Так что мне сделать, чтоб можно было наглядно увидеть разницу во времени между простым программированием и допустим моей задачей с 2 потоками. Может мне просто вместо поиска элемента сортировать массив, там, как я понимаю, n- перестановок, надеюсь будет заметно?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 19:04
Цитата Сообщение от Mansu Посмотреть сообщение
наглядно увидеть разницу во времени между простым программированием и допустим моей задачей с 2 потоками
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
 
namespace ConsoleApplication162
{
    class Program
    {
        static void Main(string[] args)
        {
 
            var rnd = new Random();
            var list = new List<int>();
            for (int i = 0; i < 10000000;i++)
                list.Add(rnd.Next(10000));
 
            //несколько потоков
            var sw = Stopwatch.StartNew();
            list.AsParallel().Where(s => s == 10).Count();
            sw.Stop();
            Console.WriteLine(sw.Elapsed);
 
            //один поток
            sw = Stopwatch.StartNew();
            list.Where(s => s == 10).Count();
            sw.Stop();
            Console.WriteLine(sw.Elapsed);
 
            Console.ReadLine();
        }
    }
}
В первом случае выполняется паралельно в несколько потоков, во втором случае - одним потоком.
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:11  [ТС]
Спасибо вам, ну я б хотел то доделать, а то Вы написали, а сам не знаю, что не так у меня. Можете конкретно там помочь, пожалуйста.

Добавлено через 3 минуты
Мне вот это не понятно
C#
1
list.AsParallel().Where(s => s == 10).Count();
и что за метод AsParallel?
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
06.02.2015, 19:13
https://msdn.microsoft.com/ru-... 10%29.aspx
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:21  [ТС]
Спасибо, но мне надо именно как я. Почему когда комментируешь первый процесс, второй ничего не ищет, почему так?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
06.02.2015, 19:23
Даже параллельное выполнение может выполняться по разному. В данном примере при уменьшении числа элементов быстрее один способ, при увеличении быстрее становится второй.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Diagnostics;
using System.Collections.Concurrent;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Random r = new Random();
            Stopwatch sw = new Stopwatch();
            int[] randArr = Enumerable.Range(0, 1000000).Select(i => r.Next(1000)).ToArray();
            int count = 0;
            sw.Start();
            count = randArr.AsParallel().Where(s => s == 10).Count();
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
 
            sw.Restart();
            count = Partitioner.Create(randArr, true).AsParallel().Where(s => s == 10).Count();
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);
            Console.ReadLine();
        }
    }
}
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:27  [ТС]
Да это понятно, я именно свой метод, который выше. Я хочу посмотреть при больших объемах массив, но у меня там работает ток 1-ый поток, а 2-ой нет, он запускается, но не ищет ничего, почему так?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 19:29
Цитата Сообщение от Mansu Посмотреть сообщение
Можете конкретно там помочь, пожалуйста.
Нет, у вас там очень неудачный пример для демонстрации многопоточности. И ошибок - выше крыши.
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:30  [ТС]
Я дурак, понял ошибку, прошу прощения, было написано if (mas[i] == a), а цикл по j.

Добавлено через 18 секунд
Спасибо Вам всем.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 19:32
Цитата Сообщение от Mansu Посмотреть сообщение
было написано if (mas[i] == a), а цикл по j.
А кроме этого, double вообще нельзя сранивать по ==.
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:34  [ТС]
Только теперь находит ошибку в той строке, ошибка: выход за пределы массива, я проверил цикл, он правильный, почему так?

Добавлено через 37 секунд
Извините, а как тогда сравнивать double?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 19:37
Цитата Сообщение от Mansu Посмотреть сообщение
выход за пределы массива, я проверил цикл, он правильный, почему так?
Потому что нужно for(i = 10000000 - 1;...) вместо for(i = 10000000;...).
Цитата Сообщение от Mansu Посмотреть сообщение
Извините, а как тогда сравнивать double?
C#
1
if(Math.Abs(a-b) <= double.Epsilon){...}
2
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:46  [ТС]
Это потому, что у меня числа с запятой?

Добавлено через 1 минуту
И как исправить еще 1 баг, у меня цикли считают до тех пор пока в каждом из них не найдут 1 число, а мне надо, чтоб они останавливались когда найдется 1 число вообще, спасибо за цикл, я понял ошибку(в С отсчет в массивах идет с 0)?

Добавлено через 2 минуты
Наверное там надо еще один метод писать для прерывания, а не как я, да?

Добавлено через 3 минуты
То есть мне надо создать метод, который буде закрывать все потоки, так?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.02.2015, 19:46
Цитата Сообщение от Mansu Посмотреть сообщение
мне надо, чтоб они останавливались когда найдется 1 число вообще
У вас циклы останавливаются когда найдено хотя бы одно число. Вы же сами пишите if (stopTread == true) break;
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
06.02.2015, 19:53  [ТС]
Ну да, а я хочу если хоть один поток нашел число, то мы закрываем 2 потока сразу. Поэтому я написал так
C#
1
2
if(stopTread)
        break;
и когда нахожу число то вызываю метод stop(), а вот сам метод:
C#
1
2
3
4
 public void stop()
        {
            stopTread = true;
        }
, но почему-то они каждый находит по заданному числу.
0
91 / 91 / 44
Регистрация: 20.04.2008
Сообщений: 331
06.02.2015, 21:06
Пардон, запутался малость с потоками
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2015, 21:06
Помогаю со студенческими работами здесь

Как сохранять список в многопоточном режиме
Есть список lst. В нем список урл. Через Parallel.For я делаю гет-запросы и манипулирую с данными. Как мы понимаем данные из списка берутся...

Подсчёт числа пи в многопоточном режиме с помощью mpi.h
Подскажите, пожалуйста, программу, которая считает число pi до 100 знака после запятой. Распараллелено на mpi и нет. Спасибо.

Различия в точности вычисления в одно/многопоточном (OMP) режиме
Различия в точности, скорости вычисления в одно/многопоточном (OMP) режиме Привет. Стала задача оптимизировать софт и ускорить за...

Как работать через одно соединение с БД в многопоточном режиме?
Как, я думаю, вы уже знаете для работы с PostgreSQL сначала необходимо установить соединение с базой данных, затем используя данное...

Реализация приложения, собирающего данные по протоколу UDP в многопоточном режиме
Здравствуйте, столкнулся с проблемой, которую не могу решить уже неделю. По заданию необходимо сделать интерфейс для приложения,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru