Функциональные блоки Win32 ReadFile в несвязанных потокахC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Функциональные блоки Win32 ReadFile в несвязанных потоках

Сообщение Гость »

Я пытаюсь запустить несколько (внешних) процессов и записать их выходные данные. Поскольку длина моей командной строки превышает 8191 символ, я не могу использовать popen/, но вместо этого я использую функциональность Win32 API CreateProcess, как описано в этой статье, посвященной Win32.
Теперь моя приблизительная схема выглядит так: p>
  • создает N потоков (C++ )
  • каждый поток пытается захватить часть работает, и если он есть, запускает внешний процесс с заданными параметрами
  • Код: Выделить всё

    WaitForSingleObject
    пока внешний процесс не завершится
  • Код: Выделить всё

    ReadFile
    выходной канал, пока он не станет пустым.
  • закройте все дескрипторы.
  • перейдите к шагу 2), проверьте, нужно ли проделать дополнительную работу. >
Я наблюдаю следующее: все потоки запускают свои внешние процессы, но по какой-то причине все блокируются в ReadFile, пока каждый поток не достигнет ReadFile!
Я бы понял взаимоблокировку, если бы оставил открытыми некоторые дескрипторы, которые следует закрыть и т. д., но я не понимаю, почему и как это могло произойти.
Опять же, если ReadFile заблокируется, если я запрошу слишком много байтов, я бы понял взаимоблокировку, но почему она разблокируется, когда каждый поток достигает ReadFile?
To Чтобы продемонстрировать эту проблему, я создал (почти) минимальный рабочий пример.
Он состоит из двух компонентов, один имитирует внешний процесс (

Код: Выделить всё

sleepHelper.cpp
), а другой порождает переменное количество потоков: выполнение одного всегда занимает 5 секунд, а все дополнительные потоки занимают 500 мс.
Это позволяет нам наблюдать за поведением:

Код: Выделить всё

.\MinimalExample.exe 3
Using thread count = 3
Thead 3: Waiting for object took 525ms.
Thead 2: Waiting for object took 525ms.
Thead 3: Reading output took 4489ms.
Thead 2: Reading output took 4489ms.
Thead 3: Executing process took 5022ms.
Thread 3 is exiting.
Thead 2: Executing process took 5022ms.
Thread 2 is exiting.
Thead 1: Waiting for object took 5015ms.
Thead 1: Reading output took 0ms.
Thead 1: Executing process took 5023ms.
Thread 1 is exiting.
Total runtime was 5025ms.
Мои вопросы:
  • Почему здесь блокируется ReadFile?
  • Почему он возвращается, когда все потоки достигли этой точки?
Для вашего удобства вы можете найти MWE здесь.
Примечания:
  • Я знаю, что могу сначала просмотреть канал и прочитать только доступные байты, но поскольку в обучающей статье используются только ReadFile и он работает, когда все потоки достигают точки, мне очень любопытно, почему это так.
  • Технически все потоки выполняют одно успешное чтение, используя ReadFile, прочитайте 49 байт, затем зависните и, наконец, вернитесь с нулевым прочитанным байтом.


Подробнее здесь: https://stackoverflow.com/questions/781 ... ed-threads
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»