При использовании iocp в пуле задач/задач для обеспечения быстрого пробуждения работника лучший способ минимизировать накладные расходы на сигнализацию порта - т.е. не нужно делать это каждую операцию очереди?Использование iocp в пуле заданий
void Worker() { while(1) { for(int spin = 0; spin < 5000; ++spin) while(queue.Count > 0) queue.PopFront()();
WaitOnCompletionPort();
}
}
...
queue.PushBack(someWork); // decide when to signal completion port but avoid doing it every queue operation ?
Например, в приведенном выше шероховатой коде эскиза есть проблема между работой в очередь и ждать вводимой если вы пытаетесь избежать сигнализаций в порт каждой операции очереди.
На самом деле, потому что я экспериментировал с, возможно, более эффективным способом толкания рабочих элементов на очередь, так что я пытался избежать сигнализаций порта для каждого элемента работы. – iam
Достаточно справедливо, почему бы не полностью удалить IOCP и вместо этого использовать семафор? ИЛИ, сохраните IOCP, удалите свою собственную очередь и посмотрите «GetQueuedCompletionStatusEx()», чтобы сразу удалить несколько завершений для обработки. –
Насколько я знаю, IOCP более эффективен и масштабируется, чем семафор. Я хочу, чтобы каждый рабочий поток сразу крал один элемент работы, так как он мог выполнять только одно задание/задание за раз. Проблема заключается в том, чтобы определить, когда указывать порт рабочих потоков между временем, которое он может начать засыпать. – iam