Pthread - В чем разница между time.h:: sleep() и pthread.h:: pthread_yield()?
Я долго искал информацию о различиях между time.h:: sleep() и pthread.h:: pthread_yield(), но не смог найти никакого твердого справочного материала, и поэтому я отправляю этот вопрос.
В чем разница между time.h:: sleep() и pthread.h:: pthread_yield()?
Update:
Причина, по которой я спрашиваю, заключается в том, что я использовал sleep() для сна() для каждого отдельного потока... и у моего приложения возникли проблемы, когда было 8 потоков против 4 потоков. Когда я выходил в интернет, чтобы увидеть, влияет ли sleep() только на каждый поток, я не нашел никакой хорошей справки о том, влияет ли Sleep() на весь процесс ИЛИ sleep() только на отдельный поток.
Ответы
Ответ 1
От pthread_yield:
Подпрограмма pthread_yield заставляет вызывающий поток отказаться от использования его процессора и ждать в очереди выполнения до того, как он будет запланирован снова. Если очередь запуска пуста, когда вызывается подпрограмма pthread_yield, вызывающий поток немедленно переносится.
Из man man:
sleep() заставляет процесс вызова спать до тех пор, пока не пройдут секунды секунд или не поступит сигнал, который не игнорируется.
Если вы не хотите иметь задержку в реальном времени в ваших потоках и просто хотите разрешить другим потокам выполнять свою работу, то pthread_yield лучше подходит, чем сон.
Ответ 2
sleep() заставляет вашу программу прекратить выполнение в течение определенного периода времени. Независимо от того, что еще происходит в системе, ваш поток не начнется снова, пока не истечет время, прошедшее до сна(). pthread_yield() уведомляет операционную систему о том, что ваш поток работает, и что он может переключать исполнение в другой поток. Однако, если нет потока с более высоким приоритетом, который должен выполнять работу в это время, ваш поток может начать снова сразу.
IOW, после sleep() ваш поток, как гарантируется, перестанет работать, даже если никто не должен запускаться, в то время как pthread_yield() - это просто вежливый способ дать другим потокам возможность запускать, если им нужно.
Обновление в ответ на обновление вопроса: sleep() и pthread_yield() влияют только на вызывающий поток.
Ответ 3
sleep (s) берет текущий поток выполнения и приостанавливает его до тех пор, пока не пройдет секунд (или он проснулся сигналом.)
Более практично, когда вы вызываете sleep(), этот поток прекратит выполнение и просто... дождитесь истечения указанного времени. Как только он пройдет, этот поток помещается в очередь готовности.
pthread_yield() говорит: "Возьмите этот поток и поместите его в готовую очередь". Ваш поток прекратит выполнение и будет находиться в состоянии ожидания, который будет выбран/запущен планировщиком. Это не гарантирует, что ваш поток не будет немедленно возобновлен. Но это дает другому потоку возможность запускать в данной точке его выполнения.
Я собираюсь выйти на конечность и сказать, что сон (0) выполнит то же самое, что и pthread_yield() - как прекращение выполнения, так и размещение потока в готовой очереди.