Вы можете использовать функцию CreateThread
для создания новой резьбы и передачи дескриптора трубы в качестве параметра функции резьбы:
DWORD PipeThread(LPVOID param) {
HANDLE hPipe = (HANDLE)param;
// Do the WriteFile operations here
return 0;
}
for(unsigned int i = 0; i < myvector.size(); i++)
CreateThread(NULL, 0, PipeThread, myvector[i], 0, NULL);
Обратите внимание, что векторный класс не является поточно-ориентированным, поэтому вы столкнетесь с проблемами с myvector.erase
, если не синхронизируете доступ к ним, например. используя критическую секцию.
Обновление: Поскольку вы упомянули высокую частоту, вы можете использовать порты завершения ввода / вывода вместо отдельного потока для каждой трубы. Затем вы можете использовать перекрывающийся ввод-вывод с WriteFile
для асинхронной записи, и вы можете иметь только один дополнительный поток, который прослушивает завершение записи:
// Initial setup: add pipe handles to a completion port
HANDLE hPort = CreateCompletionPort(myvector[0], NULL, 0, 1);
for (unsigned int i = 1; i < myvector.size(); i++)
CreateCompletionPort(myvector[i], hPort, 0, 0);
// Start thread
CreateThread(NULL, 0, PipeThread, hPort, 0, NULL);
// Do this as many times as you want
for(unsigned int i = 0; i < myvector.size(); i++) {
OVERLAPPED *ov = new OVERLAPPED;
ZeroMemory(ov, sizeof ov);
WriteFile(myvector[i], buffer, size, NULL, ov);
// If pipe handle was closed, WriteFile will fail immediately
// Otherwise I/O is performed asynchronously
}
// Close the completion port at the end
// This should automatically free the thread
CloseHandle(hPort);
---
DWRD PipeThread(LPVOID param) {
HANDLE hPort = (HANDLE)param;
DWORD nBytes;
ULONG_PTR key;
LPOVERLAPPED ov;
// Continuously loop for I/O completion
while (GetQueuedCompletionStatus(hPort, &nBytes, &key, &ov, INFINITE)) {
if (ov != NULL) {
delete ov;
// Do anything else you may want to do here
}
}
return 0;
}