如何用C++實現(xiàn)異步文件IO 重疊IO和完成端口技術(shù)解析

c++++ 中異步文件 i/o 的實現(xiàn)核心在于使用重疊 i/o 和完成端口技術(shù),以避免線程阻塞。1. 使用 overlapped 結(jié)構(gòu)體發(fā)起異步 i/o 請求,2. 創(chuàng)建并關(guān)聯(lián)完成端口以處理完成通知,3. 通過 getqueuedcompletionstatus 等待并處理 i/o 完成結(jié)果。此外,需注意錯誤處理和資源管理,如檢查 getlasterror 和關(guān)閉句柄。

如何用C++實現(xiàn)異步文件IO 重疊IO和完成端口技術(shù)解析

異步文件 I/O 在 c++ 中實現(xiàn)的核心在于讓文件操作不阻塞主線程,從而提高程序的響應(yīng)性和并發(fā)性。這通常涉及使用操作系統(tǒng)提供的重疊 I/O (Overlapped I/O) 和完成端口 (Completion Ports) 技術(shù)。簡單來說,就是發(fā)起 I/O 請求后立即返回,讓操作系統(tǒng)在后臺處理,完成后通知程序。

如何用C++實現(xiàn)異步文件IO 重疊IO和完成端口技術(shù)解析

解決方案:

如何用C++實現(xiàn)異步文件IO 重疊IO和完成端口技術(shù)解析

首先,我們需要理解重疊 I/O 的概念。重疊 I/O 允許我們發(fā)起一個 I/O 操作,而無需等待其完成。我們需要一個 OVERLAPPED 結(jié)構(gòu)體來傳遞 I/O 請求的相關(guān)信息。

立即學(xué)習(xí)C++免費學(xué)習(xí)筆記(深入)”;

#include <iostream> #include <fstream> #include <windows.h>  bool AsyncReadFile(HANDLE hFile, LPVOID buffer, DWORD bytesToRead, LPOVERLAPPED pOverlapped) {     return ReadFile(hFile, buffer, bytesToRead, NULL, pOverlapped); }

這段代碼只是一個簡單的開始,它展示了如何使用 ReadFile 函數(shù)發(fā)起一個異步讀取操作。關(guān)鍵在于最后一個參數(shù) pOverlapped,它告訴操作系統(tǒng)這是一個異步操作。如果 ReadFile 返回 FALSE,并不一定意味著失敗,而是可能操作正在進行中,需要檢查 GetLastError() 的返回值。如果是 ERROR_IO_PENDING,則表示操作正在異步執(zhí)行。

如何用C++實現(xiàn)異步文件IO 重疊IO和完成端口技術(shù)解析

接下來,我們需要處理 I/O 完成的通知。這就是完成端口發(fā)揮作用的地方。

  1. 創(chuàng)建完成端口: 使用 CreateIoCompletionPort 函數(shù)創(chuàng)建一個完成端口。

    HANDLE hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0); if (hCompletionPort == NULL) {     std::cerr << "CreateIoCompletionPort failed: " << GetLastError() << std::endl;     return 1; }
  2. 將文件句柄關(guān)聯(lián)到完成端口: 使用 CreateIoCompletionPort 函數(shù)將文件句柄與完成端口關(guān)聯(lián)起來。

    HANDLE hFile = CreateFile(L"test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hFile == INVALID_HANDLE_VALUE) {     std::cerr << "CreateFile failed: " << GetLastError() << std::endl;     return 1; }  HANDLE hAssociatedPort = CreateIoCompletionPort(hFile, hCompletionPort, (ULONG_PTR)hFile, 0); if (hAssociatedPort == NULL) {     std::cerr << "Associate file handle with completion port failed: " << GetLastError() << std::endl;     return 1; }
  3. 發(fā)起異步 I/O 請求: 使用 ReadFile 或 WriteFile 函數(shù)發(fā)起異步 I/O 請求,并將 OVERLAPPED 結(jié)構(gòu)體傳遞給函數(shù)。

  4. 等待 I/O 完成: 使用 GetQueuedCompletionStatus 函數(shù)等待 I/O 完成的通知。

    DWORD bytesTransferred; ULONG_PTR completionKey; LPOVERLAPPED pOverlapped;  BOOL bRet = GetQueuedCompletionStatus(hCompletionPort, &bytesTransferred, &completionKey, &pOverlapped, INFINITE); if (bRet == FALSE) {     std::cerr << "GetQueuedCompletionStatus failed: " << GetLastError() << std::endl;     return 1; }  std::cout << "Bytes transferred: " << bytesTransferred << std::endl;

    GetQueuedCompletionStatus 會一直阻塞,直到完成端口收到一個 I/O 完成的通知。當 I/O 完成時,bytesTransferred 變量會包含實際傳輸?shù)淖止?jié)數(shù),completionKey 變量會包含與文件句柄關(guān)聯(lián)的完成鍵,pOverlapped 變量會包含指向 OVERLAPPED 結(jié)構(gòu)體的指針

  5. 處理 I/O 完成: 在 GetQueuedCompletionStatus 返回后,我們可以處理 I/O 操作的結(jié)果。例如,可以檢查 bytesTransferred 變量的值,以確定實際傳輸?shù)淖止?jié)數(shù)。

完整的示例代碼:

#include <iostream> #include <fstream> #include <windows.h>  int main() {     HANDLE hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);     if (hCompletionPort == NULL) {         std::cerr << "CreateIoCompletionPort failed: " << GetLastError() << std::endl;         return 1;     }      HANDLE hFile = CreateFile(L"test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);     if (hFile == INVALID_HANDLE_VALUE) {         std::cerr << "CreateFile failed: " << GetLastError() << std::endl;         return 1;     }      HANDLE hAssociatedPort = CreateIoCompletionPort(hFile, hCompletionPort, (ULONG_PTR)hFile, 0);     if (hAssociatedPort == NULL) {         std::cerr << "Associate file handle with completion port failed: " << GetLastError() << std::endl;         return 1;     }      char buffer[1024];     OVERLAPPED overlapped = {0};     overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //手動重置事件      if (!ReadFile(hFile, buffer, sizeof(buffer) - 1, NULL, &overlapped)) {         if (GetLastError() != ERROR_IO_PENDING) {             std::cerr << "ReadFile failed: " << GetLastError() << std::endl;             CloseHandle(hFile);             CloseHandle(hCompletionPort);             return 1;         }     }      DWORD bytesTransferred;     ULONG_PTR completionKey;     LPOVERLAPPED pOverlapped;      BOOL bRet = GetQueuedCompletionStatus(hCompletionPort, &bytesTransferred, &completionKey, &pOverlapped, INFINITE);     if (bRet == FALSE) {         std::cerr << "GetQueuedCompletionStatus failed: " << GetLastError() << std::endl;         CloseHandle(hFile);         CloseHandle(hCompletionPort);         return 1;     }      buffer[bytesTransferred] = '

久久这里的只有是精品23|
亚洲午夜无码久久久久小说|
伊人久久大香线蕉AV色婷婷色|
久久久久亚洲AV无码观看|
久久99国内精品自在现线|
国产综合成人久久大片91|
国内精品久久国产|
久久99精品国产自在现线小黄鸭|
久久久久免费视频|
久久丫精品国产亚洲av|
精品久久久无码中文字幕天天|
久久精品青青草原伊人|
亚洲欧美精品伊人久久|
欧美黑人又粗又大久久久|
国产高潮久久免费观看|
伊人久久大香线蕉综合Av|
久久精品国产黑森林|
国产V亚洲V天堂无码久久久|
99久久免费国产精品特黄|
精品一久久香蕉国产线看播放
|
久久中文娱乐网|
尹人香蕉久久99天天拍|
91精品日韩人妻无码久久不卡|
少妇内射兰兰久久|
久久国产亚洲精品|
色婷婷综合久久久久中文字幕|
久久91精品久久91综合|
久久国产色AV免费观看|
亚洲国产另类久久久精品黑人
|
一极黄色视频久久网站|
99久久99久久精品国产|
精品久久久久久久|
av国内精品久久久久影院|
久久精品国产第一区二区三区|
亚洲国产精品无码久久久蜜芽
|
久久国产精品久久精品国产|
久久久久人妻精品一区二区三区
|
国产成人精品免费久久久久|
久久国产精品77777|
国产精品久久久久久福利漫画|
久久精品中文无码资源站|