Есть ли способ QUEUE темы? - PullRequest
1 голос
/ 20 июля 2011

Я пытаюсь выполнить симуляцию с полным буфером. Когда мой буфер переполняется, мне нужно скопировать его для дальнейшей обработки, копирование является взаимоисключающей операцией, но дальнейшая обработка - нет. Мой поток действий выглядит следующим образом: я проверяю состояние буфера каждый раз, когда собираюсь что-то написать, если условие выполняется, я копирую текущий буфер и обрабатываю его, а затем пишу новое сообщение.

У меня есть несколько тем, и сообщения должны быть написаны только в последовательности. мои функции вкратце следующие:

bwrite(data)
{
  lock(m1);
  //invoke copy thread
  lock(m1);
  // Do write message
}

copy(data)
{
 //copy the data
 unlock(m1);
 //Do further processing
}

Проблема в том, что после завершения копирования сообщения записываются в любой последовательности, например, если есть thread01, & thread02 и если thread01 копирует первое, я не могу контролировать этот факт. что thread02 может начать копирование до того, как thread01 напишет свое последнее сообщение, поэтому возможна потеря сообщения.

Это был длинный вопрос, в основном мне нужен способ поместить входящие потоки в очередь, чтобы я мог гарантировать следующую последовательность выполнения.

Ответы [ 3 ]

2 голосов
/ 20 июля 2011

Почему бы вам просто не записать потоки в общую очередь?Затем вы можете сделать так, чтобы другой поток извлекал элементы из очереди по одному и записывал их - это гарантирует, что они записаны в том же порядке, в котором они находятся в очереди.Теперь вам просто нужно синхронизировать доступ к очереди, чтобы сделать ее потокобезопасной.

0 голосов
/ 20 июля 2011

На самом деле я считаю, что лучшим решением для этого является использование BlockingQueue.Я уверен, что если вы воспользуетесь Google, вы сможете найти, что кто-то опубликовал пример кода на С ++ для него, но вот пример его использования в java http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

0 голосов
/ 20 июля 2011

Да, используйте семафор http://en.wikipedia.org/wiki/Semaphore_%28programming%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...