У меня возникла проблема, описанная здесь, и мне предложили использовать порты завершения ввода-вывода или пул потоков.
Я реализовал завершение ввода-вывода, вызывая PostQueuedCompletionStatus
для постановки задачи в очередь и GetQueuedCompletionStatus
для получения следующей задачи для ее выполнения. Я использую порт завершения ввода-вывода в качестве потокобезопасного контейнера FIFO с несколькими производителями/многопотребителями без явных блокировок. Это дает мне полный контроль над потоками, потому что мне может понадобиться завершить процесс на долгое время и сообщить о них. Также GetQueuedCompletionStatus
ожидает вызывающий поток, если не осталось задачи.
Помимо терминации, пул потоков мне подходит: мои задачи выполняются менее чем за миллисекунду, а их много. Также проще вызвать QueueUserWorkItem
и позволить ОС выполнять синхронизацию и выполнение.
Есть ли различия между двумя подходами с точки зрения производительности? Есть комментарии по поводу моей реализации?
GetQueuedCompletionStatus
и блокируют вызов, который возвращается, когда нужно выполнить работу. Windows назначит работу одному из потоков, простаивающих вGetQueuedCompletionStatus
, чтобы передать им работу. - person Ian Boyd   schedule 27.10.2013