Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
5 / 5 / 4
Регистрация: 08.02.2015
Сообщений: 63

Многопоточность - разобрать работу кода

19.05.2015, 16:00. Показов 604. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        
 
        public Form1()
        {
            InitializeComponent();
        }
        
        Thread[] t = new Thread[1000];
        int a;
        
        private void button1_Click(object sender, EventArgs e)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
 
            for (int i = 0; i < t.Length; i++)
            {
                t[i] = new Thread(Calculate);
                t[i].Start();
            }
 
            for (int i = 0; i < t.Length; i++)
            {
                t[i].Join();
            }
 
            stopWatch.Stop();
            MessageBox.Show(stopWatch.ElapsedMilliseconds.ToString());
 
            MessageBox.Show(a.ToString());
 
            a = 0;
        }
 
        void Calculate()
        {
            a++;
        }
    }
}
1) Почему этот код выполнятся так долго 3-6 секунд
2) Почему результат периодически не равен 1000 (от 997 до 1000)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2015, 16:00
Ответы с готовыми решениями:

Разобрать работу кодека g.771
Здравствуйте! Недавно возникла надобность разобрать работу кодека g.771. В инете материала море, но весь однотипный и содержит в себе...

Почему многопоточность не ускоряет выполнение кода
В массиве string содержится строки длиной в сотни знаков, каждая строка обрабатывается отдельным потоком, каждый поток запускает новый...

Файлы, сеть, многопоточность: оптимизация кода
Оговорюсь сразу, использую .NET 4.0. Это в случае будущих рекомендаций в пользу async-await =) Добрый вечер/день/утро или что у вас там) ...

4
 Аватар для Art
153 / 153 / 56
Регистрация: 20.12.2011
Сообщений: 1,614
19.05.2015, 16:12
remizz, на счет 2го:
в методе:
C#
1
2
3
4
void Calculate()
        {
            a++;
        }
"а" находится в критической секции, поэтому вы получаете неожиданный для вас результат. Это из-за того что вы не знаете какой поток, в какое время может производить обработку "а"

на счет 1го: почему вас смущает такое время?
0
5 / 5 / 4
Регистрация: 08.02.2015
Сообщений: 63
19.05.2015, 16:23  [ТС]
Art,
Цитата Сообщение от Art Посмотреть сообщение
какой поток, в какое время может производить обработку "а"
Не знаю. Но ведь в итоге a++ должно произойти 1000 раз, не зависимо от того какой поток в какое время это сделал.
Цитата Сообщение от Art Посмотреть сообщение
на счет 1го: почему вас смущает такое время?
Потому что без потоков, например вот так:
C#
1
2
3
4
5
for (int i = 0; i < 1000; i++)
            {
                a++;
            }
            MessageBox.Show(a.ToString());
результат выдается мгновенно
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
19.05.2015, 16:30
remizz,
1) В т.ч. и из-за создания 1000 потоков. Создание потока ресурсоемкий процесс.
2) a++ проходит 1000 раз, но не факт что инкремент пройдёт последовательно, вполне возможно, что при одновременном доступе 2 потоков, они одновременно получат одинаковое значение для инкремента.
1
 Аватар для Art
153 / 153 / 56
Регистрация: 20.12.2011
Сообщений: 1,614
19.05.2015, 16:39
remizz, вот тут довольно неплохо написано. Прочитайте для лучшего понимания.

P.S. Пока писал ответ на ваш вопрос, Cupko, уже ответил.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2015, 16:39
Помогаю со студенческими работами здесь

Многопоточность (по Шилдту) - разобрать строку кода
Здравствуйте! У меня вопрос: в чем смысл строки кода if(currentName != Thrd.Name) в методе Run() класса MyThread? Через конструктор класса...

Разобрать работу кода
p указывает на начало масива не пойму, как в последних двух вычисляется значение 10 20 30 40 50 ...

Разобрать работу приведенного кода
помогите написать что делают строки в программе #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cmath&gt; using namespace...

Сайт на языке Перл: разобрать работу приведенного кода
my $ib=$db-&gt;prepare(&quot;INSERT INTO lot VALUES(NULL, ?, ?, ?, ?, NULL, ?, ?, ?, ?, 'xxx.xxx')&quot;);...

Разобрать работу цикла for
Доброго всем времени, изучаю по Шилдту , вот , что интересует using System; class forDemo { static void Main () { int...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru