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

Здравствуйте. Есть 2 потока c бесконечным циклом. Один генерирует файлы

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

21 ответов

30 просмотров

а что за контейнер? Звучит как задача для BlockingQueue или подобных решений которые уже есть готовые

Olesya-Garipova Автор вопроса
Stas
а что за контейнер? Звучит как задача для Blocking...

мапа <String, List<File>>. При блокировке получается ситуация, что если первый поток выполняет много работы, то он так и не отдает управление контейнером второму потоку. Забираю данные, создавая новую мапу: val data = HashMap(container) container.clear()

Olesya Garipova
мапа <String, List<File>>. При блокировке получает...

Надо через одну структуру вести обмен и делать это быстро. Быстро положить готовые данные и быстро забрать, чтобы никого не блокировать. Задача producer-consumer.

Olesya Garipova
мапа <String, List<File>>. При блокировке получает...

Так есть же concurent мапы всякие готовые, посмотри и выбери что подходит. А то звучит как-то странно, что ты делаешь

Olesya Garipova
мапа <String, List<File>>. При блокировке получает...

типичный consumer producer. В с++ решалось через condition_variable. (И без "У каждого своя периодичность цикла", но может вам это зачем-то нужно.) Посмотрите в сторону concurrent queue и оцените, можете ли отказаться от "периодичности цикла".

Leonid B.
Надо через одну структуру вести обмен и делать это...

+1. Быстро скопировать File из мапы, удалить из мапы и отдать lock

Olesya-Garipova Автор вопроса
Pavel
типичный consumer producer. В с++ решалось через ...

Спасибо, изучу. От периодичность отказаться не могу по тз, к сожалению

Olesya Garipova
Спасибо, изучу. От периодичность отказаться не мог...

Кооперативную многопоточность знаете? При таком тз выглядит, как кейз для нее

Olesya-Garipova Автор вопроса
Olesya Garipova
не знакома, пошла гуглить)

> У каждого _своя_ или не для кооп. мн., если у одного цикл 2 сек из 4х, а у второго 4 из 6 (а не так, что сначала 2 сек из 5 один, а потом оставшиеся 3 из 5 второй). Вообще такое тз странное, ну да ладно. Это лаба/домашка или что-то коммерческое?

Olesya Garipova
рабочая задача

Ну и пусть producer и consumer с нужной им периодичностью используют общую синхронизированную структуру для обмена данными. Нужно только учесть, что как минимум запись в очередь будет блокировать читателя.

Olesya-Garipova Автор вопроса
Leonid B.
Ну и пусть producer и consumer с нужной им периоди...

вот с этим я и столкнулась, что при маленьком периоде и большом объеме записи, управление до читателя просто не доходит 😞

Olesya Garipova
вот с этим я и столкнулась, что при маленьком пери...

подозреваю, что у вас продюсер делает проверить таймер, взять лок, создать данные, положить в контейнер, отдать лок а надо примерно так проверить таймер, создать данные, взять лок, положить в контейнер, отдать лок в консюмере действовать аналогично Кстати, не оч понятно,, зачем была взята мапа. Смотрите в сторону concurrent queue

Olesya Garipova
вот с этим я и столкнулась, что при маленьком пери...

Потому что общие данные нужно менять быстро и сразу отпускать 😏 Interthread communication - оно такое.

Pavel
подозреваю, что у вас продюсер делает проверить та...

При совсем маленьком периоде, если без аналога condition_variable, вы можете получить live lock (а не deadlock), что вы м.б. и получаете

Olesya-Garipova Автор вопроса
Pavel
подозреваю, что у вас продюсер делает проверить та...

по второму сценарию делаю) первый поток опрашивает поставщиков данных, которые отдают ему уже готовые списки файлов и сохраняет в мапу <Поставщик, список файлов>

Olesya Garipova
по второму сценарию делаю) первый поток опрашивает...

к черту карту, вставайте в очередь. вам уже несколько чел написали

Olesya-Garipova Автор вопроса

спасибо, видимо тогда придется делать объекты для очереди, т.к. у каждого файла должна сохраняться инфа о поставщике

Olesya Garipova
спасибо, видимо тогда придется делать объекты для ...

но все равно, если у вас в бассейн (контейнер) через трубу стабильно вливается больше, чем может вылиться из слива, то бассейн в конце концов переполнится. нужно, чтобы in the long run производительность консьюмеров была не меньше, чем продьюсеров

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта