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

Блокировка потоков на запись и чтение в List<>

28.11.2013, 14:19. Показов 5862. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал примерный код в блокноте (схематичный код - на мелочи не обращаем внимание , думаю суть будет понятна всем что мне требуется)

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
objekt obj = new objekt;
 
List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
 
 
 
 
// эти две функции будут постоянно читать из листов 1 и 2 
void ReadList1_And_UpdateDataGrid()  // запустим в потоке номер 1
{
     while(true)
       {
       
          count = list1.count;
          if(count!=0)
          {
              for(i,count,i++)
                {
                  int b = list1[i];
                  
                  // много тысяч строк
                  DataGridView.Row[1].["Point"]= b;
                  DataGridView.Row[2].["Point"]= b;
                  DataGridView.Row[3].["Point"]= b;
                  DataGridView.Row[4].["Point"]= b;
                  DataGridView.Row[5].["Point"]= b;
                  DataGridView.Row[6].["Point"]= b;
                  
                  
                  list.RemoveAt(0); // удаляем прочитанный элемент возможно надо удалять  элемент i
                }
          }
       }
}
 
void ReadList2_And_UpdateDataGrid()// запустим в потоке номер 2
{
    while(true)
      {
         count = list2.count;
         if(count!=0)
          {
             for(i,count,i++)
               {
                 int a = list2[i];
                 
                 // примерно 100 тысяч строк в секунду может в 5 сек ))
                 DataGridView.Row[10].["Point"]= a;
                 DataGridView.Row[100].["Point"]= a;
                 DataGridView.Row[200].["Point"]= a;
                 DataGridView.Row[1000].["Point"]= a;
                 DataGridView.Row[3000].["Point"]= a;
                 DataGridView.Row[1000000].["Point"]= a;
                 
                 list.RemoveAt(0); // удаляем прочитанный элемент возможно надо элемент i
               }
           }
       }
}
 
 
 
 
// этидве функции постоянно будут добавлять данные в Листы 1 и 2 со скоростью много тысяч)))) а пока что рандом
void WriteList1()// запустим в потоке номер 3
{
  while(true)
  {
    list1.Add(123);
    Sleep(random(0,1));
  }
}
 
 
 
void WriteList2()// запустим в потоке номер 4
{
while(true)
  {
    list2.Add(123);
    Sleep(1random(0,1))
}
 
 
 
Вопрос как сделать синхронизацию только на запись и чтение из Листов , не прибегая к блокировке DataGridView
Если поставить так lock() как ниже в примере --- то DataGridView тоже будет не доступен из другого потока так как Lock блокируеt участок кода 
в котором находиться DGV
 
void ReadList2_And_UpdateDataGrid()// запустим в потоке номер 2
{
lock(obj){
    while(true)
      {
         count = list2.count;
         if(count!=0)
          {
             for(i,count,i++)
               {
                 int a = list2[i];
                 
                 // примерно 100 тысяч строк  --- вот именно вот это обновление строк 
                 // не хочется блокировать так как другой поток из другого листа может тоже добавлять данные в 
                 // другие ячейки этого DGV
                 
                 DataGridView.Row[10].["Point"]= a;
                 DataGridView.Row[100].["Point"]= a;
                 DataGridView.Row[200].["Point"]= a;
                 DataGridView.Row[1000].["Point"]= a;
                 DataGridView.Row[3000].["Point"]= a;
                 DataGridView.Row[1000000].["Point"]= a;
                 
                 list.RemoveAt(0); // удаляем прочитанный элемент возможно надо элемент i
               }
           }
       }
    }
}
 
Может можно как то заблокировать только Листы на запись и чтение из разных потоков 
Может просто вот так сделать Lock(list1) блокировка доступа только к Листу--- или так нельзя???????
 
просто у меня много обновлений в DGV(тысячи строк в секунду ) и нехотелось бы терять время блокировки , когда можно обновлять DGV из разных потоков так как они заполняют разные строки  -- ВОТ собственно и в чем проблема
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2013, 14:19
Ответы с готовыми решениями:

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

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

Чтение и запись в переменную с разных потоков
День добрый! Есть переменная и ведется в нее запись с потока 2,который является не потоком формы. И есть основной поток,который...

14
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
28.11.2013, 14:23
Создайте наследника от IList<> и реализуйте нужные методы, в них используйте lock.
0
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
28.11.2013, 14:25  [ТС]
а можно примерчик какой нибудь простенький
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
28.11.2013, 14:32
Не правильно выразился, лучше просто обертку на List<>
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
public class MyList<T>
    {
        private object _lock = new object();
 
        private List<T> resultList = new List<T>(); 
        
        public int Count
        {
            get
            {
                lock (_lock)
                {
                    return resultList.Count;
                }
            }
        }
 
        public void RemoveAt(int index)
        {
            lock (_lock)
            {
                resultList.RemoveAt(index);
            }
        }
 
        public void Add(T item)
        {
            lock (_lock)
            {
                resultList.Add(item);
            }
        }
    }
1
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
28.11.2013, 14:35  [ТС]
ок спасибо , попробуем
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
28.11.2013, 14:54
lock будет слишком медленно, используйте System.Collections.Concurrent
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
28.11.2013, 14:58
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от DataPlanner Посмотреть сообщение
lock будет слишком медленно
Медленно в чем? Если можно реальный пример.

Цитата Сообщение от DataPlanner Посмотреть сообщение
используйте System.Collections.Concurrent
Указав пространство имен, будьте добры указать на конкретный класс.
3
2 / 2 / 0
Регистрация: 05.01.2013
Сообщений: 69
28.11.2013, 15:01  [ТС]
Воо супер , это что то новенькое появилось
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
28.11.2013, 15:03
1. А поразмышлять? Начну, при переключении потока процессор начинает заполнять кэш новыми процедурами...
2. Зависит от задачи, выбирайте любой на вкус
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
28.11.2013, 15:18
Цитата Сообщение от DataPlanner Посмотреть сообщение
А поразмышлять?
Зачем мне это, это для философов, вы приведите код который будет работать медленнее с использованием lock чем без его использования.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
28.11.2013, 15:37
Очевидными глупостями не занимаюсь, если же вам захочется поэкспериментировать, исходите из того, что обычный List имеет среднюю производительность 1млн/сек, теперь замерьте с lock...
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
28.11.2013, 18:35
Цитата Сообщение от DataPlanner Посмотреть сообщение
А поразмышлять?
Где-то я это уже слышал. Дальше первого предложения в прошлый раз рассуждения так и не ушли.
Цитата Сообщение от DataPlanner Посмотреть сообщение
что обычный List имеет среднюю производительность 1млн/сек
Производительность чего?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.11.2013, 15:27
Цитата Сообщение от DataPlanner Посмотреть сообщение
2. Зависит от задачи, выбирайте любой на вкус
ТС нужен лист, не уходите от ответа!
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
30.11.2013, 15:48
Читай внимательно ConcurrentBag
0
0 / 0 / 0
Регистрация: 31.01.2018
Сообщений: 1
01.03.2018, 16:42
Цитата Сообщение от Grishaco Посмотреть сообщение
Зачем мне это, это для философов, вы приведите код который будет работать медленнее с использованием lock чем без его использования.
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Где-то я это уже слышал. Дальше первого предложения в прошлый раз рассуждения так и не ушли.
Чего докопались? Сами объяснять не умеете.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2018, 16:42
Помогаю со студенческими работами здесь

Чтение/запись объектов из файлов в несколько потоков
Здравствуйте. Есть N файлов. В них записаны объекты с помощью ObjectInputStream. Есть M потоков. Каждый из них должен делать...

Запись в файл и чтение из него без создания двух потоков
Знаю да есть класс StreamReader и StreamWriter но зачем мне делать 2 потока, мне хочется просто как в С++ открыть 1 обьект на...

Запись List<string> в файл и чтение из файла
Всем привет! есть List&lt;string&gt; код: List&lt;string&gt; list = new List&lt;string&gt;(); Что мне нодо... Нужно записать этот лист в файл...

Запись и чтение List<Users> в файл, с файла
Здравствуйте, форумчане. У меня есть лист List&lt;Users&gt; list, какую технологию нужно использовать, чтобы когда я вызвал метод Add у листа и...

Чтение и запись типов, массив типов и List<> данных в файл
Здравствуйте Подскажите способ записи и чтения любых типов данных (не компонентов) Например это: string в котором текст может быть...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru