Работа lock со списками

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

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
534
Реакции
229
Баллы
43
Всем привет!
Каким образом лочится список?
Посмотрел почти все обсуждения на форуме,как я понял такая конструкция лочит список
Код:
Развернуть Свернуть Копировать
lock(SyncObjects.ListSyncer)
{
var list = project.Lists["Baza"];
var otherlist = project.Lists["BazaEnd"];
    for (int i = 0; i < 6; i++)
        {
            otherlist.Add(list[i]);
            list.RemoveAt(i);
            }
}
Данный код берет строку от 0 до 6,и в многопотоке по идее пока из списка поток не заберет 6 значений список будет не тронут другими потоками.Так ли это?
Сделал тест.Собрал в список acc строки 1,2,3,4,5,6 и сделал повторения то есть в списке только эти цифры от 1 до 6.
Далее сделал 6 списков,назвал аналогично 1,2,3,4,5,6 .
Далее шаблон на старте берет из списка acc первую строку в переменную acc,и выполняет такой код
Код:
Развернуть Свернуть Копировать
var lists = project.Variables["acc"].Value;//номер из списка acc
lock(SyncObjects.ListSyncer) // начало лок
{
    var list = project.Lists["Baza"];// Исходный список
    var otherlist = project.Lists[lists];// один из 6 списков в зависимости от значения переменной acc
    for (int i = 0; i < 6; i++) //берет из списка baza 6 строк
        {
            otherlist.Add(list[i]);//добавляет в один из списков полученную строку
            list.RemoveAt(i);//удаляет из списка baza полученную строку
            }
}//лок конец
Как я понял список должен быть заблокирован пока поток не закончит выполнение данного действия.
Теперь запускаю шаблон в 6 потоков,и по идее должно получится в списке 1 строки 1,2,3,4,5,6,в списке 2 строки 7,8,9,10,11,12 и т.д.
Но так не получается,лок банально не работает как описано в темах на форуме.
Получаю в списках значения например 1,8,13,20,24,31.
Так же пробовал сделать как в конкурсной статье из 8 конкурса,но результаты одни и те же.
Пробовал на zp 5.10.6 и 5.15.0 ситуация одинакова.
Так как же лочит список в многопоток?
 
Теперь запускаю шаблон в 6 потоков,и по идее должно получится в списке 1 строки 1,2,3,4,5,6,в списке 2 строки 7,8,9,10,11,12 и т.д.
Но так не получается,лок банально не работает как описано в темах на форуме.
Получаю в списках значения например 1,8,13,20,24,31.
У вас ошибка в логике цикла, присмотритесь. Почему, например, с таким кодом в первый список попадут значения 1,3,5,7,9,11 вместо 1,2,3,4,5,6, неважно есть многопоток или нет?
 
  • Оценить
Реакции: Vlad_Curnoi
У вас ошибка в логике цикла, присмотритесь. Почему, например, с таким кодом в первый список попадут значения 1,3,5,7,9,11 вместо 1,2,3,4,5,6, неважно есть многопоток или нет?
потому что он её удаляет в цикле и берёт по счётчику
 
  • Оценить
Реакции: Vlad_Curnoi
У вас ошибка в логике цикла, присмотритесь. Почему, например, с таким кодом в первый список попадут значения 1,3,5,7,9,11 вместо 1,2,3,4,5,6, неважно есть многопоток или нет?
Вот именно что ошибки в логике нет,так как идет работа в 6 потоков в примере,аккаунты от 1 до 6 берутся из списка вначале,далее идет работа с 6 разными списками имя списка одинаково с аккаунтом то есть если взяли из списка аккаунт 1 то и работает поток с списком 1.
Код что писал выше должен лочить список общей базы и в цикле он берет по очередно строки и пишет в список соответствующий текущему аккаунту удяляя при этом из списка baza полученные значения,то есть лок идет на 2 текстовика baza и список 1 (или 2,или 3 и т.д в зависимости от аккаунта),но лок не происходит,другие потоки не ждут выполнения лока из другого потока и все ровно берут из списка baza значения.
В коде выход из лока только по окончанию цикла
 
как нет, внимательно смотри, ты берёшь первую строку по счётчику, удаляешь её, счётчик уже 1 стал но строка 1 сдвинулась на 0, поэтому ты получаешь строки через одну, и лок тут не при чём, хоть 100 потоков, ты первым потоком уже косячишь
 
  • Оценить
Реакции: Vlad_Curnoi
как нет, внимательно смотри, ты берёшь первую строку по счётчику, удаляешь её, счётчик уже 1 стал но строка 1 сдвинулась на 0, поэтому ты получаешь строки через одну, и лок тут не при чём, хоть 100 потоков, ты первым потоком уже косячишь
Аа блин,извиняюсь.Сейчас протестирую!))Спасибо!))Я что то прям вообще на это не обратил винмание
 
как нет, внимательно смотри, ты берёшь первую строку по счётчику, удаляешь её, счётчик уже 1 стал но строка 1 сдвинулась на 0, поэтому ты получаешь строки через одну, и лок тут не при чём, хоть 100 потоков, ты первым потоком уже косячишь
а как вернуть кол-во строк в файле через c#?))
 

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