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

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

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

21 ответов

27 просмотров

а что за контейнер? Звучит как задача для 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 производительность консьюмеров была не меньше, чем продьюсеров

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта