Насколько я понимаю, код выше делает то же самое.
Нет, код совсем не тот.
Sync.Q.Требуется официант (ы) для предложения, чтобы преуспеть.LBQ сохранит предмет, и предложение будет немедленно завершено, даже если официанта нет.
SyncQ полезен для передачи задач.Представьте, что у вас есть список с ожидающей задачей и 3 доступных потока, ожидающих в очереди, попробуйте offer()
с 1/4 списка, если не принято, поток может выполнить задачу самостоятельно.[последний 1/4 должен обрабатываться текущим потоком, если вам интересно, почему 1/4, а не 1/3]
Подумайте о попытке передать задачу работнику, если у вас нет ни одного доступноговозможность выполнить задачу самостоятельно (или сгенерировать исключение).Напротив, с LBQ, оставление задачи в очереди не гарантирует выполнения.
Примечание: случай с потребителями и издателями одинаков, то есть издатель может блокировать и ждать потребителей, но послеoffer
или poll
возвращает, это обеспечивает выполнение задачи / элемента.