Зависание потоков при использовании критических секции

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Зависание потоков при использовании критических секции

Сообщение MysticCoder » 22.10.2017 23:27:57

Sasha писал(а):MysticCoder Попрубую Ваш вариант. Правда решение для Линкуса нужно, но думаю можно его перетащить на Линукс.


это и есть решение для линукса, я его из под него и запускал
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Зависание потоков при использовании критических секции

Сообщение скалогрыз » 22.10.2017 23:31:14

где параллелизм-то?

у тебя есть один поток. ну пусть он сначала усиленно уменьшает счётчик. А потом усиленного его увеличивает. Зачем 2 рабочих потока?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Зависание потоков при использовании критических секции

Сообщение Sasha » 23.10.2017 02:19:48

MysticCoder Благодарю за Ваше решение, оно работает. Попробую его на реальной проге.
Вот циклограмма:
1- по очерёдная работа потоков
2- момент когда основной поток решил целых 5 секунд лицезреть значение счётчика.
Изображение
Изображение
Чёрный цвет ожидание, красный цвет основная работа.

скалогрыз О параллелизме речь не шла. Необходимо было синхронизировать работу потоков так, чтобы они выполнялись строго друг за другом.
Не надо мне усиленно увеличивать, а потом усиленно уменьшать. Представьте, что каждый потоки управляют поршнем, один поднимает, другой опускает и его нельзя долго поднимать, а потом долго опускать.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Re: Зависание потоков при использовании критических секции

Сообщение скалогрыз » 23.10.2017 02:28:36

Не понимаю почему один поток не может с этим справиться.
Поршень же один. В чём соль двух потоков, которые всё-равно по очереди работают?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Зависание потоков при использовании критических секции

Сообщение Sasha » 23.10.2017 11:03:31

скалогрызДа в примере с поршнем вполне справится один поток. В реальной проге каждый поток разделён на 2 части, есть часть, которая выпоняет накопление и часть, которая обрабатывает накопление, копить одновременно потоки не могут, а обрабатывать пожалуйста, вот тут и будет параллельность.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Re: Зависание потоков при использовании критических секции

Сообщение serbod » 23.10.2017 13:20:12

Sasha Ну так сделай отдельный класс потока для накопления и отдельный для обработки. Накопил - кладешь данные в очередь обработки. Потоки обработки берут из очереди данные, обрабатывают и передают результат куда-то еще. Блокировки нужны только для добавления в очередь и взятия из очереди.

Да, это сложнее и больше строк кода. Но зато гораздо проще в отладке и надежнее в работе. Напишешь за пару часов, а сэкономишь пару недель, а может и месяцев, потраченных на отладку и вопросы на форумах.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Зависание потоков при использовании критических секции

Сообщение Sasha » 23.10.2017 14:29:29

serbodПараметры накопления могу зависеть от того, что там выдала обработка. Но в некоторых случаях Ваше предложение работать будет, спасибо за совет, возьму его на вооружение в некоторых режимах.

Тема закрыта, ответ я получил. Еще раз спасибо MysticCoder.
Sasha
новенький
 
Сообщения: 41
Зарегистрирован: 07.12.2015 01:27:43

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

Рейтинг@Mail.ru