Различие между монитором. Импульс и монитор. PulseAll

Вы сказали, что используете date-fns, поэтому я дам ответ по этому поводу.

Текущая версия 1.x не поддерживает синтаксический анализ строк в произвольном формате, но они добавляют это в 2.x, и вы можете использовать альфа-релиз, чтобы попробовать его сегодня.

Синтаксис:

var date = parse(dateString, formatString, baseDate, [options]);

См. Документацию по функции parse в версии 2.0.0-alpha.27 .

В вашем случае это было бы так:

var date = parse("21/03/2019 19:18", "MM/dd/yyyy HH:mm", new Date());

Наконец, если вы хотите использовать библиотеку для этого, но не хотите экспериментировать с альфой, вы можете либо подождать до даты -fns 2.0, чтобы стать финальным, или вы можете попробовать Luxon или Moment - оба из которых уже имеют эту функциональность (хотя Moment использует немного другой формат токенов "MM/DD/YYYY HH:mm"). ]

27
задан casperOne 4 October 2011 в 14:13
поделиться

2 ответа

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

Использовать Pulse когда Вы только захотите разбудить один поток, потому что только один поток на самом деле сможет сделать полезную работу.

Дать две аналогии:

Предположите, что у Вас есть единственный принтер. Только один человек может использовать его за один раз, поэтому если Вы получены много людей, ожидающих, Вы отправляете их всех для сна - но Вы только будите одного человека, когда принтер становится свободным. Это зеркально отражает использование Pulse.

Теперь предположите выполнение магазина. В то время как Вы закрываетесь, клиенты ждут снаружи магазина. При открытии магазина Вы только хотите разбудить одного клиента - они могут все войти теперь. Это зеркально отражает использование PulseAll.

44
ответ дан Jon Skeet 28 November 2019 в 04:21
поделиться

A Monitor имеет две очереди: ожидающая очередь и готовая очередь. В отсутствие Wait и Pulse, все потоки, которые пытаются получить блокировку, входят в готовую очередь. Когда блокировка станет доступной, один поток от готовой очереди получит ее.

Когда поток получает блокировку и затем делает a Wait, тот поток входит в ожидающую очередь. Это ожидает a Pulse или PulseAll, и останется в ожидающей очереди, пока она не получит a Pulse, даже если другие потоки от готовой очереди получают и выпускают блокировку.

Pulse перемещения один поток от ожидающей очереди готовой очереди. PulseAll перемещения ВСЕ потоки от ожидающей очереди готовой очереди.

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

Существует довольно хорошее обсуждение Ожидания и Импульса - по крайней мере немного для запущения Вас - здесь.

36
ответ дан Jim Mischel 28 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

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