2010-07-19 6 views
0

При использовании 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 ?

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

ответ

1

Почему вы не используете IOCP в качестве своей очереди и не публикуете свои рабочие элементы прямо на нее? Таким образом, вы получаете бесплатную очередь потоков и можете полностью удалить другую оставшуюся очередь?

Этот вопрос будет затем уйти;)

+0

На самом деле, потому что я экспериментировал с, возможно, более эффективным способом толкания рабочих элементов на очередь, так что я пытался избежать сигнализаций порта для каждого элемента работы. – iam

+0

Достаточно справедливо, почему бы не полностью удалить IOCP и вместо этого использовать семафор? ИЛИ, сохраните IOCP, удалите свою собственную очередь и посмотрите «GetQueuedCompletionStatusEx()», чтобы сразу удалить несколько завершений для обработки. –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^