Вопрос по lock

  • Автор темы Автор темы Sorrow
  • Дата начала Дата начала

Sorrow

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

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

Как правильно записать команды на С#
1. привязка списка к файлу
2. удалить строку из списка по рег.выражению ^\s*$ (пустая строка)
3. добавить в список строку из переменной
4. удалить дубли из списка
5. сохранить список в файл
 
Эти кубики сами лочат.
 
Эти кубики сами лочат.
это понятно что кубик сам лочит, только суть в том, что вся эта батарея кубиков должна выполниться без "влазивания" других потоков.
Если первый или второй(третий...) кубик отработал, то ни чего не мешает другому потоку начать работать эту стопку кубиков. Надо залочить все стопку кубиков, для этого коды всех кубиков необходимо впихнуть в один кубик кода C# под одним локом

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

отсюда и вопрос как это сделать?
 
что ж мне из-за трех строк нужно проштудировать весь учебник по 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
Вам лок здесь не нужен. Здесь нужно выстроить логику работы с кубиками.

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

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

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

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

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

Все тоже самое можно сделать и через файл, а не глобальные переменные.
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
 
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
Сделайте через файл.
Записываем в файл значение 0. Когда начинаем нужные манипуляции, то проверяем что в файле: если 1, то файлы для работы заняты и поток ждет очереди, если 0, то можно с ними работать. Если значение 0, то сразу же записываем в файл 1. По окончании нужных манипуляций, записываем в файл обратно 0.
P.S. В 50 потоков пока не подводило.
 
Сделайте через файл.
Записываем в файл значение 0. Когда начинаем нужные манипуляции, то проверяем что в файле: если 1, то файлы для работы заняты и поток ждет очереди, если 0, то можно с ними работать. Если значение 0, то сразу же записываем в файл 1. По окончании нужных манипуляций, записываем в файл обратно 0.
P.S. В 50 потоков пока не подводило.
Да, с файлом всё понятно, а вот с глобальной переменной нет. С переменной понадёжней будет.
 
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
в проекте и должна быть инициализация, только на уровне кода. Создавать самом глобалку в окошке переменных нельзя. А в локе должна быть проверка, существует ли, если да - повышать или понижать, если это счетчик. От логики зависит. Если не существует - инициализировать со стартовым значением
 
Начал пробовать данный способ с глобальной переменной, но тут возник вопрос, где инициировать глобальную переменную?
Ведь если инициацию проводить в проекте, то каждый поток будет присваивать начальное значение переменной и смысл лока от этой глобальной переменной теряется. Где инициировать глобальную переменную?
Сделай проверку инициализации глобальной переменной.

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

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