передача переменной в поток после того, как она уже началась - PullRequest
0 голосов
/ 26 января 2011

Я новичок в C ++ и повышение.

В рамках своей магистерской диссертации я написал программу, которая имитирует статистическую модель. Во время вычислений я использую boost :: thread для обработки моего «вектора центра масс», чтобы сэкономить некоторое время вычислений. Пока все хорошо.

Теперь я хотел бы взять каждый результат из boost :: thread (каждый раз по одному элементу) и передать его работающему потоку, который собирается предварительно рекурсивно регрессировать.

Мои вопросы:

  • как я могу передать свой новый вычисляемый элемент в существующий поток?
  • как я могу "разбудить" поток, когда я пропущу новый элемент?

Я был бы рад, если бы кто-то мог указать мне на существующий пример.

Ответы [ 3 ]

2 голосов
/ 26 января 2011

самый простой способ - использовать std :: queue , boost :: mutex и boost :: conditional_variable .обернуть любой доступ к очереди мьютексом, после нажатия на вызов очереди conditional_variable.notify_one().в потоке потребителей дождитесь условного_варианта, пока не будет готов любой результат, затем обработайте его.

0 голосов
/ 26 января 2011

Вы должны использовать mutex и / ro semaphore, чтобы синхронизировать ваши потоки и заблокировать переменную, чтобы обеспечить потокобезопасную связь. Просто отметьте, что все threads в вашем процессе совместно используют одну и ту же память, чтобы вы могли получить доступ к одним и тем же данным, но вы должны делать это потокобезопасным способом.

Я не уверен, что библиотека boost реализует какие-либо потоковые примитивы, но вот хорошее руководство по многопоточному программированию с использованием потоков POSIX - http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

0 голосов
/ 26 января 2011

Проверенным способом управления потоком из другого потока является отправка сообщений через комбинацию очереди с условной переменной.К сожалению, boost :: thread не предоставляет стандартного решения, и при его реализации есть несколько хитростей (возможные тупики, поведение при заполнении очереди, использование полиморфных сообщений ...)

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