170 похожих чатов

Всем привет, подскажите кто в курсе у меня два потока,

один пишет в коллекцию другой удаляет с коллекции, при копировании коллекции в которую пишет другой поток выходит исключение, предполагаю что сначала коллекции temp выделяется определенное место и в это время коллекция которую копирую вырастает и потому ошибка выходит, как можно решить данную проблему?

10 ответов

15 просмотров

нужно защитить lock любое обращение к коллекции (как в первой строке). В этом куске вначале есть блокировка, в конце нет. Возможно в другом потоке тоже нет. ну и не понятно как объявлен temp

Александр- Автор вопроса
Сергей C
нужно защитить lock любое обращение к коллекции (к...

temp перед lock объявлен List<string> temp = new List<string>(); а что значит в конце нет блокировки? я локом закрываю общую коллекцию на 2 потока, записываю данные в temp и потом открываю коллекцию для 2=ух потоков

Александр
temp перед lock объявлен List<string> temp = new ...

после строки if(delete) должен следjвать lock как в первой строке

Александр- Автор вопроса
Сергей C
после строки if(delete) должен следjвать lock ка...

а зачем? если в этот метод только в своем потоке крутится? т.е. никто не удалит из коллекции данные кроме этого потока

Александр- Автор вопроса
Сергей C
так второй же поток пишет в него

один только пишет в допустим коллекцию 1, второй поток создает переменную и копирует в нее данные из коллекции 1, затем этот же поток удаляет с коллекции 1 значение, коллекция уже изменилась, увеличилась, он выходит из метода и снова заходит, снова создает новую коллекцию и копирует из коллекции 1 уже новые значения

Александр
один только пишет в допустим коллекцию 1, второй п...

Каждое обращение в разных потоках к коллекции 1 должно быть защищено lock, чтоб пока один поток читает/пишет/удаляет в этой коллекции, другой поток ждал своей очереди

Александр- Автор вопроса
Сергей C
Каждое обращение в разных потоках к коллекции 1 до...

а понял в чем причина, в List каждая ячейка содержит ссылку на другую ячейку и если мы с одного потока удаляем, то ссылки пропадают

Александр
а понял в чем причина, в List каждая ячейка содерж...

я бы код чуть чуть переписал. Типа этого. List<string> collection1 = new List<string>(); List<string> copyCollection = new List<string>(); lock (collection1) { copyCollection.AddRange(collection1.Distinct().ToList()); collection1.RemoveAll(a => CheckDataCrc(a)); }

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта