LINUX.ORG.RU

[C++,boost] Вопрос по boost::condition_variable::wait


0

1

В документации говорится, что разблокировка ожидающего потока происходит при вызовах condition_variable::notify, condition_variable::notify_all, or spuriously. Какие методы входят в это spuriously? И какое время будет отдано на ожидание? А то пример, приведённый там,

boost::condition_variable cond;
boost::mutex mut;
bool data_ready;

void process_data();

void wait_for_data_to_process()
{
    boost::unique_lock<boost::mutex> lock(mut);
    while(!data_ready)
    {
        cond.wait(lock);
    }
    process_data();
}

выглядит так, будто wait выполняется ограниченное количество времени, и периодически выполняется проверка data_ready.

В Жабе тоже wait нужно заключать в while-loop. Стандарт там допускает ложные срабатывания.

Absurd ★★★
()

> Какие методы входят в это spuriously?

Жжошь, сцуко.

выглядит так, будто wait выполняется ограниченное количество времени, и периодически выполняется проверка data_ready.


Оно не только так выглядит.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

> Жжошь, сцуко

Стараюсь. :-)

Оно не только так выглядит


Как то неестественно, всё же, получается. Две переменные, одну ждём, вторую на контроль первой ставим.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

Две переменные, одну ждём, вторую на контроль первой ставим.


Ты задачу про потребитель-производитель почитай.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Reset

например если системный вызов был прерван сигналом

Не обязательно. В линуксе, например, этого не происходит.

ratatosk
()
Ответ на: комментарий от Boy_from_Jungle
#include <signal.h>
#include <pthread.h>
#include <stdio.h>
#include <assert.h>

void handler(int signo, siginfo_t *a, void *b) {
  printf("got signal %d\n", signo);
}

int main() {
  struct sigaction sa;
  sa.sa_flags = SA_SIGINFO;
  sigemptyset(&sa.sa_mask);
  sa.sa_sigaction = handler;
  assert(sigaction(SIGUSR1, &sa, NULL) == 0);

  pthread_cond_t cond;
  assert(pthread_cond_init(&cond, NULL) == 0);

  pthread_mutex_t mut;
  assert(pthread_mutex_init(&mut, NULL) == 0);

  assert(pthread_mutex_lock(&mut) == 0);
  
  pthread_cond_wait(&cond, &mut);

  return 0;
}

проверь: kill -USR1 pid

ratatosk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.