Код: Выделить всё
pclose
Теперь моя приблизительная схема выглядит так: p>
- создает N потоков (C++ )
- каждый поток пытается захватить часть работает, и если он есть, запускает внешний процесс с заданными параметрами
- пока внешний процесс не завершится
Код: Выделить всё
WaitForSingleObject
- выходной канал, пока он не станет пустым.
Код: Выделить всё
ReadFile
- закройте все дескрипторы.
- перейдите к шагу 2), проверьте, нужно ли проделать дополнительную работу. >
Я бы понял взаимоблокировку, если бы оставил открытыми некоторые дескрипторы, которые следует закрыть и т. д., но я не понимаю, почему и как это могло произойти.
Опять же, если ReadFile заблокируется, если я запрошу слишком много байтов, я бы понял взаимоблокировку, но почему она разблокируется, когда каждый поток достигает ReadFile?
To Чтобы продемонстрировать эту проблему, я создал (почти) минимальный рабочий пример.
Он состоит из двух компонентов, один имитирует внешний процесс (
Код: Выделить всё
sleepHelper.cpp
Это позволяет нам наблюдать за поведением:
Код: Выделить всё
.\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?
- Почему он возвращается, когда все потоки достигли этой точки?
Примечания:
- Я знаю, что могу сначала просмотреть канал и прочитать только доступные байты, но поскольку в обучающей статье используются только ReadFile и он работает, когда все потоки достигают точки, мне очень любопытно, почему это так.
- Технически все потоки выполняют одно успешное чтение, используя ReadFile, прочитайте 49 байт, затем зависните и, наконец, вернитесь с нулевым прочитанным байтом.
Подробнее здесь: https://stackoverflow.com/questions/781 ... ed-threads