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

Реализовать многопоточный доступ к N-ой переменной из N-го кол-во потоков

12.03.2012, 16:44. Показов 3837. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день дорогие пользователи.
В общем проблема состоит в том,что мне нужно реализовать многопоточный доступ к N-ой переменной из N-го кол-во потоков. Используя один поток все идет как по маслу,но если мы ставим 2 и более потоков,потоки начинаю использовать дубли то есть,допустим имеем файл с 4 строками.

Code
1
2
3
4
line1
line2
line3
line4
Я хочу что бы при при указании 4 потоков каждая из линий выводилась синхронно в своем потоке.
Но я получаю на выходе :

Code
1
2
3
4
5
6
line1
line1
line1
line1
line2
и т.п
Очень прошу как объяснить как реализовать данное
Спасибо за внимание.
p.s
Так же пробовал использовать "критическую секцию" lock/Monitor и прочее,на выходе все тоже самое но с заметной задержкой.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2012, 16:44
Ответы с готовыми решениями:

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

Нужно ли синхронизировать доступ к переменной из двух потоков?
Допустим есть два потока: основной и вторичный. 1. И допустим есть глобальная переменная bool b; Вопрос: является ли b...

Реализовать доступ к закрытой переменной
Можно ли в C++ получить доступ к закрытым переменным из класса Two в классе One, без изменения One? На сколько я знаю, друзей можно...

10
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.03.2012, 17:06
Цитата Сообщение от Sufle Посмотреть сообщение
Я хочу что бы при при указании 4 потоков каждая из линий выводилась синхронно в своем потоке.
Очень прошу объяснить что означает фраза "выводилась синхронно".
0
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 6
12.03.2012, 17:10  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Очень прошу объяснить что означает фраза "выводилась синхронно".
Да возможно не так выразился.
Имеем 4 строки в файле,мне нужно что бы каждый из строк выводился в своем потоке ,то есть одновременно. При условии того, что я могу управлять кол-вом потоков.Передача строки потоку не вариант.Теперь надеюсь понятно
И так же при условии, что два разных потока не использовали одну строку файла
0
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
12.03.2012, 17:16
Может слишком быстро выводятся фразы? На создание нового потока уходит время, следовательно если очень быстро выводить то создастся ощущение что они выводятся по очереди. Поставь тридслип перед выводом если так и есть.
0
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 6
12.03.2012, 17:25  [ТС]
Цитата Сообщение от KeBJIaP Посмотреть сообщение
Может слишком быстро выводятся фразы? На создание нового потока уходит время, следовательно если очень быстро выводить то создастся ощущение что они выводятся по очереди. Поставь тридслип перед выводом если так и есть.
Нет нет,тут проблема в том что два и более потоков используют одну и туже строку дважды,трижды.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.03.2012, 17:31
Так сделайте простую синхронизацию:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
object locker = new object();
int i = 0;
string[] lines; // Здесь хранятся строки из файла
 
void ThreadCallback()
{
   while (true)
   {
      string line
      lock (locker)
         if (i < lines.Length) line = lines[i++]; else break;
 
      Console.WriteLine(line);
   }
}
0
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 6
12.03.2012, 17:39  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Так сделайте простую синхронизацию:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
object locker = new object();
int i = 0;
string[] lines; // Здесь хранятся строки из файла
 
void ThreadCallback()
{
   while (true)
   {
      string line
      lock (locker)
         if (i < lines.Length) line = lines[i++]; else break;
 
      Console.WriteLine(line);
   }
}
Цитата Сообщение от Sufle Посмотреть сообщение
Так же пробовал использовать "критическую секцию" lock/Monitor и прочее,на выходе все тоже самое но с заметной задержкой.
.....
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.03.2012, 17:42
Цитата Сообщение от Sufle Посмотреть сообщение
.....
Код один в один как приведенный?
А то в нем "заметной задержки" нет.
0
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 6
12.03.2012, 17:53  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Код один в один как приведенный?
А то в нем "заметной задержки" нет.
Вот код
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
static string[] line;
        static void Main(string[] args)
        {
            Thread[] th = null;
            line = File.ReadAllLines("file.txt");
            Console.Write("Кол-во потоков : ");
            int thCount = int.Parse(Console.ReadLine());
 
            th = new Thread[thCount];
            for (int i = 0; i < thCount; i++)
            {
                th[i] = new Thread(ShowResult);
                th[i].Start();
            }
        }
        static object locker = new object();
        static void ShowResult()
        {
            int lineCount = 0;
            while (lineCount != line.Length)
            {
                lock (locker)
                {
                    Console.WriteLine(line[lineCount]);
                }
                lineCount++;
            }
            Console.ReadLine();
        }
Результат -
Code
1
2
3
4
5
Кол-во потоков : 1
line1
line2
line3
line4
Тот же код 4 потока.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Кол-во потоков : 4
line1
line2
line3
line4
line1
line2
line3
line4
line1
line2
line3
line4
line1
line2
line3
line4
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.03.2012, 18:05
Ну так у вас же все наоборот.
1. Переменная lineCount должна быть общая для всех потоков.
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
34
static string[] line;
        static void Main(string[] args)
        {
            Thread[] th = null;
            line = File.ReadAllLines("file.txt");
            Console.Write("Кол-во потоков : ");
            int thCount = int.Parse(Console.ReadLine());
 
            th = new Thread[thCount];
            for (int i = 0; i < thCount; i++)
            {
                th[i] = new Thread(ShowResult);
                th[i].Start();
            }
            foreach (var thread in th) th.Join();
            Console.WriteLine("Done");
            Console.ReadKey(true);
        }
        static object locker = new object();
 
        static int lineCount = 0;
        static void ShowResult()
        {
            while (true)
            {
                string str = null;
                lock (locker)
                {
                   if (lineCount < line.Length) str = line[lineCount++];
                   else return;
                }
                Console.WriteLine(str);
            }
        }
1
0 / 0 / 0
Регистрация: 12.03.2012
Сообщений: 6
12.03.2012, 18:14  [ТС]
Да похоже это то что мне нужно.
Спасибо всем кто пытался помочь особенно тем кто помог
Пожалуй возьму ваш код на вооружение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.03.2012, 18:14
Помогаю со студенческими работами здесь

Многопоточный чат с использованием пула потоков
есть вопрос как реализовать можно чат с использованием пулов потоков.Без пула все понятно на каждого клиента создается поток и потоки висят...

Как реализовать доступ через точку к переменной
У меня есть функция: int ReadId(string folder) { //какой-то код Count++; // в цикле увеличивает return value; }...

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...

Многопоточный доступ к MemoryStream?
Как реализовать?

Многопоточный доступ к файлу
видел, эта тема обсасывалась не раз на просторах сайберфорума, но никаких продвижений по этому поводу у меня не случилось... таки...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru