C ++ pthread_t - Как остановить pthread_t на период времени - PullRequest
0 голосов
/ 14 декабря 2011

Как можно остановить pthread_t на определенный период времени? И я имею в виду не использовать функцию сна;)

Ответы [ 5 ]

1 голос
/ 14 декабря 2011

Если ваша библиотека реализации потоков поддерживает это, вы можете использовать pthread_suspend и pthread_continue из основного потока или другой, используя любой вид "подсчета времени ожидания".

См. Справочные страницы о нормальном использовании.

1 голос
/ 14 декабря 2011

Используйте pthread_cond_wait (или pthread_cond_timedwait, но, вероятно, нет), чтобы заблокировать поток. Вам понадобится предикат - переменная, которая содержит значение, указывающее, должен ли поток идти или останавливаться. И вам понадобится мьютекс для защиты предиката и переменной условия. Затем другой поток может разблокировать поток, взяв мьютекс, изменив предикат, сообщив переменную условия и освободив мьютекс.

Однако, как правило, вы просто не должны этого делать. Если есть что сделать, вы должны позволить потоку сделать это. Если делать нечего, поток должен быть закодирован для завершения или ожидания работы. Если вам нужно форсировать это с помощью конкретного кода, скорее всего, вы делаете что-то не так с самого начала.

Нить должна быть закодирована, чтобы делать все и только то, что вы хотите, чтобы она делала. Вам не нужно «толкать его» снаружи, за исключением действительно необычных ситуаций.

0 голосов
/ 14 декабря 2011

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

Некоторые возможности включают в себя:

0 голосов
/ 14 декабря 2011

вы могли бы ждать самого дескриптора потока с тайм-аутом ... Дескриптор потока сигнализируется после завершения потока, поэтому время ожидания истекает во время работы.

0 голосов
/ 14 декабря 2011

Ха,

насколько точно это должно быть? Вы можете рассмотреть возможность запуска другого потока, как только первый поток будет остановлен. Этот «новый» поток запускается в течение определенного времени, а затем перезапускает поток номер один. Если остановка нужна только один раз, вы можете добавить счетчик.

Если вам все это нужно многократно, вы также можете рассмотреть pthread, запускаемый по времени.

С уважением, G.

...