Подтвердить что ты не робот

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() только на отдельный поток.

4b9b3361

Ответ 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() - как прекращение выполнения, так и размещение потока в готовой очереди.