Используйте PulseAll
, если вы хотите активировать несколько потоков, потому что условие, которое они ждут, теперь может быть выполнено для нескольких потоков. (Ожидание почти всегда связано с условием - вы обычно должны проверять это условие в цикле while
.)
Используйте Pulse
, когда вы хотите разбудить только один поток, потому что только один поток действительно сможет выполнять полезную работу.
Чтобы привести две аналогии:
Представьте, что у вас есть один принтер. Только один человек может использовать его одновременно, поэтому, если вас ждет много людей, вы отправляете их всех спать, но вы разбудите только одного человека, когда принтер освободится. Это отражает использование Pulse
.
Теперь представьте, что вы управляете магазином. Пока вы закрыты, клиенты ждут снаружи магазина. Когда вы открываете магазин, вы не просто хотите разбудить одного покупателя - все они могут прийти сейчас. Это отражает использование PulseAll
.