Многопоточность, когда уступить по сравнению со сном

Для разъяснения терминологии урожай - когда поток бросает свой интервал времени. Моя платформа интереса является потоками POSIX, но я думаю, что вопрос является общим.

Предположим, что у меня есть шаблон потребителя/производителя. Если я хочу отрегулировать или потребителя или производителя, которого лучше использовать, спать или уступить? Я главным образом интересуюсь эффективностью использования любой функции.

12
задан Palec 29 July 2015 в 10:17
поделиться

3 ответа

«Правильный» способ кодирования производителя / потребителя - заставить потребителя ждать данных от производителя. Вы можете добиться этого, используя объект синхронизации, такой как Mutex. Потребитель будет ждать мьютекса, который блокирует его выполнение до тех пор, пока не станут доступны данные. В свою очередь, производитель сигнализирует мьютексу, когда данные доступны, что пробуждает поток потребителя, чтобы он мог начать обработку. Это более эффективно, чем спящий режим , как с точки зрения:

  • загрузки ЦП (циклы не тратятся впустую), так и
  • времени выполнения (выполнение начинается, как только данные становятся доступными, а не когда поток запланировано просыпаться).

Тем не менее, вот анализ зависимости отдачи от сна, который вы просили. Вам может потребоваться использовать такую ​​схему, если по какой-то причине ожидание вывода невозможно:

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

Вы, вероятно, захотите либо спать на короткий период времени (возможно, менее секунды, используя usleep ), ЛИБО лучше использовать объект синхронизации, такой как мьютекс, чтобы сигнализировать о доступности данных. .

10
ответ дан 2 December 2019 в 07:20
поделиться

сон и выход - это не одно и то же. При вызове сна процесс / поток передает ЦП другому процессу / потоку на заданное время.

yield передает ЦП другому потоку, но может немедленно вернуться, если нет других потоков, ожидающих ЦП.

Итак, если вы хотите регулировать скорость, например, при потоковой передаче данных через равные промежутки времени, используйте функции сна или наносна.

Если требуется синхронизация между производителем и потребителем, следует использовать мьютекс / условное ожидание.

10
ответ дан 2 December 2019 в 07:20
поделиться

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

Уступка в этой ситуации на самом деле не так сильно помогает, потому что перспектива случайного отката может увеличить вероятность того, что нехватка потоков не произойдет.

Edit: Хотя я знаю, что это не обязательно специфично для Java. Реализация Java Thread.sleep (0) имеет тот же эффект, что и Thread.yield () . В этом случае это скорее вопрос стиля.

1
ответ дан 2 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: