Вопрос по lock

Sorrow

Пользователь
Регистрация
02.01.2019
Сообщения
37
Благодарностей
2
Баллы
8
Есть кусок кода работы со списком в кубиках
upload_2019-4-19_18-38-43.png

Подскажите как этот кусок залочить, что бы кубики не перепутывались в многопотоке.
Как совокупность этих кубиков засунуть в код
Код:
//Лочим код изменения списка для многопотока
lock (SyncObjects.ListSyncer)
{
    //тут совокупность команд заменяющих выше показанные кубики
}
Как правильно записать команды на С#
1. привязка списка к файлу
2. удалить строку из списка по рег.выражению ^\s*$ (пустая строка)
3. добавить в список строку из переменной
4. удалить дубли из списка
5. сохранить список в файл
 

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 315
Благодарностей
869
Баллы
113
Эти кубики сами лочат.
 

Sorrow

Пользователь
Регистрация
02.01.2019
Сообщения
37
Благодарностей
2
Баллы
8
Эти кубики сами лочат.
это понятно что кубик сам лочит, только суть в том, что вся эта батарея кубиков должна выполниться без "влазивания" других потоков.
Если первый или второй(третий...) кубик отработал, то ни чего не мешает другому потоку начать работать эту стопку кубиков. Надо залочить все стопку кубиков, для этого коды всех кубиков необходимо впихнуть в один кубик кода C# под одним локом

Код:
//Лочим код изменения списка для многопотока
lock (SyncObjects.ListSyncer)
{
    //тут коды всех кубиков
}
отсюда и вопрос как это сделать?
 

Sorrow

Пользователь
Регистрация
02.01.2019
Сообщения
37
Благодарностей
2
Баллы
8

indus

Client
Регистрация
14.06.2014
Сообщения
207
Благодарностей
60
Баллы
28

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 813
Благодарностей
1 188
Баллы
113
что ж мне из-за трех строк нужно проштудировать весь учебник по C#, а перед этим еще англиский выучить?
Ty mozshesh neuchitsja i sidjet v uglu, net problem. ;-)
Prosto smotritsja sto hochesh stobi vsjo zdjelal za tybja.

Yest google.translate.com i jetj forum poisk. Davai za djelu.
 
  • Спасибо
Реакции: zortexx

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 474
Благодарностей
576
Баллы
113
Вам лок здесь не нужен. Здесь нужно выстроить логику работы с кубиками.

1. Инициализоровали глобальную переменную lockBlock.
2. Присвоили значение 0
3. 1 поток перед входом в кубики проверяет какое значение у глобальной переменной, если 0 то входим и выполняем, если 1 то пропускаем.
4.В конце этого блока переменной lockBlock присваивается значение 1, что уже не даст другим потокам войти в блок.

Все тоже самое можно сделать и через файл, а не глобальные переменные.
 
  • Спасибо
Реакции: orka13 и Sorrow

Sorrow

Пользователь
Регистрация
02.01.2019
Сообщения
37
Благодарностей
2
Баллы
8
Вам лок здесь не нужен. Здесь нужно выстроить логику работы с кубиками.

1. Инициализоровали глобальную переменную lockBlock.
2. Присвоили значение 0
3. 1 поток перед входом в кубики проверяет какое значение у глобальной переменной, если 0 то входим и выполняем, если 1 то пропускаем.
4.В конце этого блока переменной lockBlock присваивается значение 1, что уже не даст другим потокам войти в блок.

Все тоже самое можно сделать и через файл, а не глобальные переменные.
Вот за это, большое спасибо! Действительно, оригинально.
А то, иди учись..., пользуй поиск...))
 

Sorrow

Пользователь
Регистрация
02.01.2019
Сообщения
37
Благодарностей
2
Баллы
8
Вам лок здесь не нужен. Здесь нужно выстроить логику работы с кубиками.

1. Инициализоровали глобальную переменную lockBlock.
2. Присвоили значение 0
3. 1 поток перед входом в кубики проверяет какое значение у глобальной переменной, если 0 то входим и выполняем, если 1 то пропускаем.
4.В конце этого блока переменной lockBlock присваивается значение 1, что уже не даст другим потокам войти в блок.

Все тоже самое можно сделать и через файл, а не глобальные переменные.
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
Сделайте через файл.
Записываем в файл значение 0. Когда начинаем нужные манипуляции, то проверяем что в файле: если 1, то файлы для работы заняты и поток ждет очереди, если 0, то можно с ними работать. Если значение 0, то сразу же записываем в файл 1. По окончании нужных манипуляций, записываем в файл обратно 0.
P.S. В 50 потоков пока не подводило.
 

Sorrow

Пользователь
Регистрация
02.01.2019
Сообщения
37
Благодарностей
2
Баллы
8
Сделайте через файл.
Записываем в файл значение 0. Когда начинаем нужные манипуляции, то проверяем что в файле: если 1, то файлы для работы заняты и поток ждет очереди, если 0, то можно с ними работать. Если значение 0, то сразу же записываем в файл 1. По окончании нужных манипуляций, записываем в файл обратно 0.
P.S. В 50 потоков пока не подводило.
Да, с файлом всё понятно, а вот с глобальной переменной нет. С переменной понадёжней будет.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
в проекте и должна быть инициализация, только на уровне кода. Создавать самом глобалку в окошке переменных нельзя. А в локе должна быть проверка, существует ли, если да - повышать или понижать, если это счетчик. От логики зависит. Если не существует - инициализировать со стартовым значением
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 474
Благодарностей
576
Баллы
113
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
Сделай проверку инициализации глобальной переменной.

Если есть, не инициализируем и не меняем значение до блока, который должен быть задействован.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)