Перейти к содержанию
    

синхронизация потоков

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

 

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

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно создать два семафора: один для потока DoTask для сигнализации о завершении выполнения задачи и один для лока метода DoTask, чтобы в него не входили одновременно более одного потока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно создать два семафора

пока делаю просто на одном семафоре с блокировкой метода постановки в очередь. Но хотелось бы сделать отслеживание именно своей очереди, т.к. потом будут потоки, которым не надо дожидаться результатов работы DoTask (на пример чтение данных - ждем готовности а запись - просто положили в очередь без ожидания)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

А что мешает на каждый Task1..TaskN сделать отдельную очередь?

При этом надо чтоб каждая из задач дождалась обработки своих данных в очереди. Как это сделать?

TaskN дожидается пока ёвная очередь станет пустой, только после этого помещает новые данные. DoTask берёт данные из очереди методом xQueuePeek не удаляя их из очереди. после обработки удаляем данные из очереди, тем самым позволяя TaskN помещать туда новые данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что мешает на каждый Task1..TaskN сделать отдельную очередь?

а при написании кода не известно сколько будет этих тасков, по тому очередь одна, кладут туда все. Смысла в нескольких очередях нет, тогда достаточно просто семафор и вызов функции обработки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Terminator

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...