Pthread - В чем разница между time.h :: sleep () и pthread.h :: pthread_yield ()? - PullRequest
14 голосов
/ 02 июня 2009

Я потратил много времени на поиск информации о различиях между time.h :: sleep () и pthread.h :: pthread_yield (), но не смог найти какого-либо твердого справочного материала, поэтому я публикую этот вопрос.

В чем разница между time.h :: sleep () и pthread.h :: pthread_yield ()?

Обновление:

Причина, по которой я спрашиваю, заключается в том, что я использовал sleep () для sleep () каждого отдельного потока ... и у моего приложения возникли проблемы, когда было 8 потоков против 4 потоков. Когда я вошел в сеть, чтобы посмотреть, влияет ли sleep () только на каждый поток, я не смог найти хороших ссылок на то, влияет ли Sleep () на весь процесс ИЛИ sleep () влияет только на отдельный поток.

Ответы [ 3 ]

15 голосов
/ 02 июня 2009

С pthread_yield :

Подпрограмма pthread_yield заставляет вызывающий поток отказаться от использования своего процессора и ждать в очереди выполнения, прежде чем он снова будет запланирован. Если очередь выполнения пуста при вызове подпрограммы pthread_yield, вызывающий поток немедленно перепланируется.

Из справочной страницы sleep :

sleep () переводит вызывающий процесс в спящий режим до истечения секунд или до тех пор, пока не поступит сигнал, который не игнорируется.

Если вы не хотите, чтобы ваши потоки задерживались в реальном времени, и просто хотите, чтобы другие потоки выполняли свою работу, тогда pthread_yield лучше подходит, чем sleep.

13 голосов
/ 02 июня 2009

sleep () заставляет вашу программу останавливаться на определенный промежуток времени. Независимо от того, что еще происходит в системе, ваш поток не запустится снова, пока, по крайней мере, не пройдет время, отведенное для sleep (). pthread_yield () уведомляет операционную систему о том, что ваш поток завершил работу и может переключать выполнение на другой поток. Однако, если в это время нет потока с более высоким приоритетом, который должен был бы работать, ваш поток может сразу же возобновиться.

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

Обновление в ответ на обновление вопроса: sleep () и pthread_yield () влияют только на вызывающий поток.

1 голос
/ 02 июня 2009

sleep (s) принимает текущий поток выполнения и приостанавливает его до тех пор, пока не пройдет s секунд (или он не проснется от сигнала.)

В более практическом смысле, когда вы вызываете sleep (), этот поток прекращает выполнение и просто ... ждет, пока не истечет указанное время. После прохождения этот поток помещается в очередь готовности.

pthread_yield () говорит: «Возьми этот поток и положи его в очередь готовности». Ваш поток остановит выполнение и будет находиться в состоянии «ожидания» для выбора / запуска планировщиком. Это не гарантирует, что ваш поток не будет немедленно возобновлен. Но это дает возможность другому потоку запускаться в определенный момент своего выполнения.

Я собираюсь выйти на конечность и сказать, что sleep (0) выполнит то же самое, что и pthread_yield () - и остановит выполнение, и поместит поток в очередь готовности.

...