設定 i o port I O 完成埠實現

2021-10-16 03:06:19 字數 2586 閱讀 6718

這篇文章是繼承上篇《windows 同步裝置 i/o 與非同步裝置 i/o》,未讀過的讀者可以去看看再來看這篇文章哈。
建立新的i/o完成埠

i/o完成可能是最複雜的windows核心物件了,為了建立乙個i/o完成端**們需要呼叫createiocompletionport函式:

handle winapi createiocompletionport(

_in_ handle filehandle,

_in_opt_ handle existingcompletionport,

_in_ ulong_ptr completionkey,

_in_ dword numberofconcurrentthreads

);

這個函式執行兩項不同的任務:它不僅會建立乙個i/o完成埠,而且會將乙個裝置與乙個i/o完成埠關聯起來。為了只建立乙個i/o完成端**們可以對上面的函式進行封裝:

handle createnewcompletionport(dword threadsize)

這個函式只有乙個引數threadsize,它呼叫了createiocompletionport來建立乙個新i/o完成埠。為了只建立乙個i/o完成埠前三個引數傳入固定值invalid_handle_value, null和0,第四個引數告訴i/o完成端在統一時間最多有多少執行緒處於可執行的狀態。如果threadsize傳入0,那麼i/o埠會使用預設值也就是cpu數量。這個通常也是我們想要的。

將裝置和i/o完成埠關聯

當我們建立乙個i/o完成埠的時候,系統核心實際上會建立5個不同的資料結構。

我們封裝乙個函式將i/o完成埠和裝置關聯:

bool devicewithcopletionport(handle hcompletionport, handle hdevice, dword  dwcompletionkey)

hcompletionport 為createnewcompletionport建立完成埠的控制代碼、hdevice為裝置控制代碼、dwcompletionkey 為完成鍵當i/o完成時會返回我們設定的dwcompletionkey的值。這個值作業系統並不關心但是我們自己需要關心。

如何使執行緒等待i/o完成通知

執行緒通過呼叫getqueuedcompletionstatus可以將自己切換到睡眠狀態,來等待裝置i/o請求完成並進入完成埠。

bool getqueuedcompletionstatus(

handle completionport,

lpdword lpnumberofbytestransferred,

pulong_ptr lpcompletionkey,

dword dwmilliseconds

);

直接上**

//新建工程iocomplet工程, 拷貝**到main.cpp

#include #include #include #define vioserial_port_path l"e:codeiocompletdebugiocomplet1.pdb"

#define max_size 20

char buf[max_size];

handle hport;

handle h;

handle createnewcompletionport(dword threadsize)

bool devicewithcopletionport(handle hcompletionport, handle hdevice, dword dwcompletionkey)

enum iotype

m_iotype;

};void func()}}

} printf("endn");

} printf("end endn");

}int main()

else

std::thread proc(func);

proc.detach();

sleep(1000);

myio myio;

myio.hevent = null;

myio.internal = 0;

myio.internalhigh = 0;

myio.offset = 0;

myio.offsethigh = 0;

myio.m_iotype = myio::iotype::io_read;

dword readsize;

bool retr = readfile(h, buf, max_size, &readsize, &myio);

if (retr == false)

}} sleepex(infinite, false);

return 0;

}

- end -

完成埠實現echo tcp server

include stdio.h include winsock2.h pragma comment lib,ws2 32.lib define port 5150 define data bufsize 8192 typedef struct char buffer data bufsize int...

windows io完成埠例項

pragma once include pragma comment lib,ws2 32.lib define data bufsize 512 enum typedef struct io operation data io operation data class iocp include i...

I O 完成埠實現

這篇文章是繼承上篇 windows 同步裝置 i o 與非同步裝置 i o 未讀過的讀者可以去看看再來看這篇文章哈。建立新的i o完成埠 i o完成可能是最複雜的windows核心物件了,為了建立乙個i o完成端 們需要呼叫createiocompletionport函式 handle winapi...