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

Многопоточное программирование

19.05.2020, 12:40. Показов 1436. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С помощью ThreadPool, ReaderWriterLock
На входе - имя каталога. Первый поток просматривает исходный каталог и все вложенные подкаталоги, записывает в очередь все файлы, которые там хранятся (как вариант - файлы какого-то определенного типа).
Второй поток последовательно берет файлы из очереди, считает у каждого файла сумму первых трех байт , и выводит на консоль результат: имя файла – значение суммы. Синхронизировать потоки, чтобы они не блокировали друг друга при обращении к очереди.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2020, 12:40
Ответы с готовыми решениями:

Многопоточное программирование
Здравствуйте, читал литературу по C# с целью разобраться как сделать многопоточную программу, но намешал каши в голове. Не могли бы вы...

Многопоточное программирование
Программа выполняется в одном потоке. Есть три обработчика событий. Как сделать так, чтобы каждый обработчик выполнялся в отдельном потоке...

Асинхронное vs. Многопоточное программирование
Здравствуйте. Изучая темы многопоточности и асинхронного программирования, у меня возник вопрос. В чем разница вызвать метод асинхронно или...

3
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
19.05.2020, 15:13
Лучший ответ Сообщение было отмечено Sasha234 как решение

Решение

ReaderWriterLock устарел еще в 2005, сейчас вместо него используют ReaderWriterLockSlim. С ним будет как то-так:
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApp51
{
    class Program
    {
        const string FILEPATH = @"C:\Temp";
        static readonly Random rnd = new Random();
        static readonly ReaderWriterLockSlim locker = new ReaderWriterLockSlim();
        static readonly Queue<string> queue = new Queue<string>();
 
        static void Main(string[] args)
        {
            Task.Run(() => { Write(); });
            Task.Run(() => { Read(); });
 
            Console.ReadKey();
        }
 
        private static void Read()
        {
            while (true)
            {
                Thread.Sleep(rnd.Next(10, 200));
                if (locker.TryEnterReadLock(10))
                {
                    try
                    {
                        if (queue.Count == 0)  continue; 
 
                        var file = queue.Dequeue();
                        var buffer = new byte[3];
                        
                        using var fs = new FileStream(file, FileMode.Open, FileAccess.Read);
                        fs.Read(buffer, 0, buffer.Length);
                        fs.Close();
 
                        var sum = Enumerable.Range(0, buffer.Length).Select(x => (int)buffer[x]).Sum();
 
                        Console.WriteLine($"{file} - {sum}");
                    }
                    catch { }
                    finally
                    {
                        locker.ExitReadLock();
                    }
                }
            }
        }
 
        static void Write()
        {
            var files = Directory.GetFiles(FILEPATH, "*.*", SearchOption.AllDirectories);
 
            foreach (var file in files)
            {
                Thread.Sleep(rnd.Next(10, 200));
                if (locker.TryEnterWriteLock(10))
                {
                    try
                    {
                        queue.Enqueue(file);
                    }
                    finally
                    {
                        locker.ExitWriteLock();
                    }
                }
            }
        }
    }
}
Но если рассматривать актуальный .NET Core, то нужно использовать каналы, они примерно на два порядка быстрее ReaderWriterLockSlim. С ними то же решение выглядит как то так:
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
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
 
namespace ConsoleApp51
{
    class Program
    {
        const string FILEPATH = @"C:\Temp";
        static readonly Random rnd = new Random();
        static readonly Channel<string> channel = Channel.CreateUnbounded<string>(new UnboundedChannelOptions() { SingleWriter = true, SingleReader = true });
 
        static void Main(string[] args)
        {
            Task.Run(() => { Write(); });
            Task.Run(async () => { await Read(); });
 
            Console.ReadKey();
        }
 
        private static async Task Read()
        {
            while (await channel.Reader.WaitToReadAsync())
            {
                try
                {
                    var file = await channel.Reader.ReadAsync();
 
                    var buffer = new byte[3];
                    using var fs = new FileStream(file, FileMode.Open, FileAccess.Read);
                    fs.Read(buffer, 0, buffer.Length);
                    fs.Close();
 
                    var sum = Enumerable.Range(0, buffer.Length).Select(x => (int)buffer[x]).Sum();
 
                    Console.WriteLine($"{file} - {sum}");
                }
                catch { }
            }
        }
 
        static void Write()
        {
            var files = Directory.GetFiles(FILEPATH, "*.*", SearchOption.AllDirectories);
 
            foreach (var file in files)
            {
                Thread.Sleep(rnd.Next(10, 200));
 
                while (!channel.Writer.TryWrite(file)) { };
            }
        }
    }
}
0
1 / 1 / 0
Регистрация: 10.12.2018
Сообщений: 112
21.05.2020, 18:21  [ТС]
Если файл будет большой (5 ГБ) и если бы у нас была другая функция для подсчета контрольной суммы (например, сумма всех байт), наше приложение надолго бы заблокировало доступ к очереди. Насколько можно уменьшить блокировку для нашей задачи и в каком случае нам потребовалось бы помещать в блокировку сам файл?
И в методе Write с какой целью стоит Thread.Sleep(1000)?
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
21.05.2020, 20:00
Цитата Сообщение от Sasha234 Посмотреть сообщение
Если файл будет большой (5 ГБ) и если бы у нас была другая функция для подсчета контрольной суммы (например, сумма всех байт), наше приложение надолго бы заблокировало доступ к очереди. Насколько можно уменьшить блокировку для нашей задачи
Да просто выкинуть тяжелую функцию в отдельный поток и пусть выполняется сколько угодно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
 Task.Run(() =>
                        {
                            var buffer = new byte[5_000_000];
 
                            using var fs = new FileStream(file, FileMode.Open, FileAccess.Read);
                            fs.Read(buffer, 0, buffer.Length);
                            fs.Close();
 
                            var sum = Enumerable.Range(0, buffer.Length).Select(x => (int)buffer[x]).Sum();
 
                            Console.WriteLine($"{file} - {sum}");
                        });
Цитата Сообщение от Sasha234 Посмотреть сообщение
в каком случае нам потребовалось бы помещать в блокировку сам файл?
Если в него писать что-нибудь. Но для этого помещать его в блокировку все равно не нужно. Вобще работать с дисковой системой в многопотоке ущербная идея - за такое могут и пальцы поломать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2020, 20:00
Помогаю со студенческими работами здесь

Что такое многопоточное программирование?
Здравствуйте, а можете пожалуйста объяснить чайнику что такое многопоточное программирование, если можно, то с примером на c# Заранее...

Многопоточное программирование по Шилдту: разобрать код
Друзья, у меня вопрос от новичка. Читаю книгу Шилдта и вот дошёл до главы многопоточного программирования. В книге приведён следующий...

Многопоточное
Добрый день, есть код не свой, раскидал в него вывод текста с информацией о потоке. Только изучаю тему, и насколько понял...

Многопоточное приложение
Требуется разработать многопоточное приложение (в качестве средства разработки следует использовать Microsoft Visual Studio). Приложение...

многопоточное вычисление
Как организовать многопоточное вычисление функции (x+5)^(2/3) + abs(x+2)^2 - ln(5*tg(x)) - exp(7*sqrt(x))?


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru