Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: синхронизация потоков
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
Sagittarius
Здравствуйте.

Подскажите пожалуйста, какими средствами сделать: есть несколько потоков Task1..TaskN, которые кладут данные в одну очередь, обрабатываемую потоком DoTask. Все потоки Task1..TaskN запихивают данные в очередь через один метод класса, содержащего DoTask. При этом надо чтоб каждая из задач дождалась обработки своих данных в очереди. Как это сделать? Пока что придумал только вместе с данными запихивать в очередь указатель на семафор и время его жизни, но для этого надо либо использовать heap2-3 или переделать семафор чтоб он располагался в стеке создающего его потока. Но хочется heap1 и без переделок.

Спасибо.
shmur
Можно создать два семафора: один для потока DoTask для сигнализации о завершении выполнения задачи и один для лока метода DoTask, чтобы в него не входили одновременно более одного потока.
Sagittarius
Цитата(shmur @ Sep 25 2012, 15:24) *
Можно создать два семафора

пока делаю просто на одном семафоре с блокировкой метода постановки в очередь. Но хотелось бы сделать отслеживание именно своей очереди, т.к. потом будут потоки, которым не надо дожидаться результатов работы DoTask (на пример чтение данных - ждем готовности а запись - просто положили в очередь без ожидания)
juvf
Цитата(Sagittarius @ Sep 25 2012, 17:13) *
Здравствуйте.

... есть несколько потоков Task1..TaskN, которые кладут данные в одну очередь, обрабатываемую потоком DoTask. Все потоки Task1..TaskN запихивают данные в очередь

А что мешает на каждый Task1..TaskN сделать отдельную очередь?
Цитата
При этом надо чтоб каждая из задач дождалась обработки своих данных в очереди. Как это сделать?

TaskN дожидается пока ёвная очередь станет пустой, только после этого помещает новые данные. DoTask берёт данные из очереди методом xQueuePeek не удаляя их из очереди. после обработки удаляем данные из очереди, тем самым позволяя TaskN помещать туда новые данные.
Sagittarius
Цитата(juvf @ Sep 27 2012, 06:30) *
А что мешает на каждый Task1..TaskN сделать отдельную очередь?

а при написании кода не известно сколько будет этих тасков, по тому очередь одна, кладут туда все. Смысла в нескольких очередях нет, тогда достаточно просто семафор и вызов функции обработки.
Terminator
Можно передавать в очередь указатель на задачу посылающую сообщение. В DoTask усыплять пославшую задачу, а после обработки события, задачу будить. Просто и почти без накладных расходов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.