Ждите уведомления в C ++ - PullRequest
3 голосов
/ 13 октября 2011

Не строго связано с C ++, я ищу больше дизайна или предложения о том, как подойти к этому.

Скажите, у меня есть

class A
{
public:
   void process();
   void wait();
}

Сначала я позвоню process(), который (duuh) выполняет некоторую обработку и затем вызывает wait().Предполагается, что функция wait() ожидает уведомления и затем завершает работу.У меня уже есть логика для уведомлений в отдельном потоке, но я не совсем уверен, каков наилучший подход для этого.

Что я подумал:

void A::wait()
{
   while ( _notificationOccured == false )
   {
   }
}

где_notificationOccured может быть членом bool A, который будет изменен уведомлением.Но, опять же, я не уверен, что это лучший подход.Есть предложения?

Ответы [ 5 ]

2 голосов
/ 13 октября 2011

То, что вы делаете, называется занято ожиданием .

Существуют различные методы, чтобы сделать это лучше, проще всего было бы использовать обычный мьютекс с уведомлением о состоянии (win32 / pthreads / boost)).

2 голосов
/ 13 октября 2011

Объединение в пул для переменной дает ужасную производительность, потому что поток пула занимает почти все процессорное время. Вам нужно использовать события или сообщения - это зависит от платформы. Для этого вы можете использовать некоторую переносимую библиотеку, например, Boost.

1 голос
/ 13 октября 2011

В вашем текущем подходе введена петля питания, которая снижает производительность системы, на которой вы работаете. Вы должны ввести короткое время сна (достаточно 10 мс), чтобы этого не происходило. А еще лучше использовать библиотеку, например Boost (как предложено @Nim).

Кстати, опрос, как ты, не так уж и плох. Фактически это то, что делают так называемые спин-замки . Идея состоит в том, что короткое время опроса более эффективно, чем блокировка, если ожидаемое время ожидания короткое.

0 голосов
/ 13 октября 2011

Я знаю это только из Windows, поэтому не знаю, легко ли это переводится на другие платформы.

В псевдокоде:

Timer myTimer(1, MYEVENT); // elapses every second
SetTimer( myTimer );       // register timer with event loop

while( running )
{
  if( GetEvent() == MYEVENT )
  {  

  }
}

В Windows GetEvent () вызывается WaitForSingleObject (...)

0 голосов
/ 13 октября 2011

Два варианта:

  1. семафоры
  2. Условия

Обе являются специфическими для ОС, Boost поддерживает последние. Есть и другие способы (например, атомарные операции, но то, как они отображаются, зависит от компилятора). ИМХО, я бы использовал один из вышеперечисленных.

...