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

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
461
Благодарностей
198
Баллы
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 ситуация одинакова.
Так как же лочит список в многопоток?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 866
Баллы
113
в последнем конкурсе была статья об этом
 

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
461
Благодарностей
198
Баллы
43

LaGir

Client
Регистрация
01.10.2015
Сообщения
227
Благодарностей
926
Баллы
93
Теперь запускаю шаблон в 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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
У вас ошибка в логике цикла, присмотритесь. Почему, например, с таким кодом в первый список попадут значения 1,3,5,7,9,11 вместо 1,2,3,4,5,6, неважно есть многопоток или нет?
потому что он её удаляет в цикле и берёт по счётчику
 
  • Спасибо
Реакции: Vlad_Curnoi

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
461
Благодарностей
198
Баллы
43
У вас ошибка в логике цикла, присмотритесь. Почему, например, с таким кодом в первый список попадут значения 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 значения.
В коде выход из лока только по окончанию цикла
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
как нет, внимательно смотри, ты берёшь первую строку по счётчику, удаляешь её, счётчик уже 1 стал но строка 1 сдвинулась на 0, поэтому ты получаешь строки через одну, и лок тут не при чём, хоть 100 потоков, ты первым потоком уже косячишь
 
  • Спасибо
Реакции: Vlad_Curnoi

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
461
Благодарностей
198
Баллы
43
как нет, внимательно смотри, ты берёшь первую строку по счётчику, удаляешь её, счётчик уже 1 стал но строка 1 сдвинулась на 0, поэтому ты получаешь строки через одну, и лок тут не при чём, хоть 100 потоков, ты первым потоком уже косячишь
Аа блин,извиняюсь.Сейчас протестирую!))Спасибо!))Я что то прям вообще на это не обратил винмание
 

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
461
Благодарностей
198
Баллы
43
как нет, внимательно смотри, ты берёшь первую строку по счётчику, удаляешь её, счётчик уже 1 стал но строка 1 сдвинулась на 0, поэтому ты получаешь строки через одну, и лок тут не при чём, хоть 100 потоков, ты первым потоком уже косячишь
а как вернуть кол-во строк в файле через c#?))
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

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