Восстановить контекст потока и продолжить его выполнение? - PullRequest
0 голосов
/ 26 июля 2010

Как я могу заставить бездействующий поток снова активироваться так, чтобы его контекст восстанавливался и выполнение продолжалось (например, если я хочу, чтобы поток активировался через 10 секунд, а затем активировался через каждые 5 секунд, в то же время другие потокиможет продолжить бегать)?

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Разве вы не можете просто спать в течение необходимого времени? Контекст является неотъемлемой частью потока, поэтому будет автоматически восстановлен.

0 голосов
/ 26 июля 2010

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

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

Это очень упрощенная версия подхода.(Для начала, что, если следующий рабочий элемент будет сохранен до завершения предыдущего?) Точная реализация во многом зависит от используемого вами API.Попытайтесь найти несколько сценариев «потребитель-производитель» для этого API, это должно дать вам достаточно информации для анализа.

0 голосов
/ 26 июля 2010

Как я могу заставить бездействующий поток снова активироваться так, чтобы его контекст восстанавливался и выполнение продолжалось (например, если я хочу, чтобы поток активировался через 10 секунд, а затем активировался через каждые 5 секунд, в среднемвремя другие потоки могут продолжать работать)?

Это зависит от вашей модели потоков: используете ли вы потоки Windows?повысить темы?Pthreads?Темы XPCOM?что-то еще?

В Windows вы можете приостановить потоки и снова активировать их.

В boost / pthreads вы должны либо:

  • запуститьнить каждые пять секунд, затем позволить ему работать и умирать (и запустить еще раз через пять секунд)

  • или запустить его и либо сказать «вы сейчас активны» извне (например, вызов функции по таймеру)

  • или оставьте ее в спящем режиме на пять секунд, затем выполните обработку, затем снова перейдите в спящий режим

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

Что вы пытаетесь сделать?

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