реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
Sagittarius
сообщение Sep 25 2012, 11:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Здравствуйте.

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

Спасибо.
Go to the top of the page
 
+Quote Post
shmur
сообщение Sep 25 2012, 11:24
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553



Можно создать два семафора: один для потока DoTask для сигнализации о завершении выполнения задачи и один для лока метода DoTask, чтобы в него не входили одновременно более одного потока.
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Sep 25 2012, 11:50
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(shmur @ Sep 25 2012, 15:24) *
Можно создать два семафора

пока делаю просто на одном семафоре с блокировкой метода постановки в очередь. Но хотелось бы сделать отслеживание именно своей очереди, т.к. потом будут потоки, которым не надо дожидаться результатов работы DoTask (на пример чтение данных - ждем готовности а запись - просто положили в очередь без ожидания)
Go to the top of the page
 
+Quote Post
juvf
сообщение Sep 27 2012, 02:30
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Sagittarius @ Sep 25 2012, 17:13) *
Здравствуйте.

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

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

TaskN дожидается пока ёвная очередь станет пустой, только после этого помещает новые данные. DoTask берёт данные из очереди методом xQueuePeek не удаляя их из очереди. после обработки удаляем данные из очереди, тем самым позволяя TaskN помещать туда новые данные.
Go to the top of the page
 
+Quote Post
Sagittarius
сообщение Sep 27 2012, 10:47
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659



Цитата(juvf @ Sep 27 2012, 06:30) *
А что мешает на каждый Task1..TaskN сделать отдельную очередь?

а при написании кода не известно сколько будет этих тасков, по тому очередь одна, кладут туда все. Смысла в нескольких очередях нет, тогда достаточно просто семафор и вызов функции обработки.
Go to the top of the page
 
+Quote Post
Terminator
сообщение Oct 3 2012, 04:28
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Можно передавать в очередь указатель на задачу посылающую сообщение. В DoTask усыплять пославшую задачу, а после обработки события, задачу будить. Просто и почти без накладных расходов.

Сообщение отредактировал Terminator - Oct 3 2012, 04:29
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 13:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016