Windows系統程式設計之非同步I O和完成埠

2021-06-18 08:53:34 字數 2348 閱讀 8150

tag: 

iocp

完成埠completion port

一、   同步i/o和非同步i/o

**:

dword    nreadbyte ;

byte    bbuf[buf_size] ;

readfile ( hfile, bbuf, sizeof(bbuf), &nreadbyte, &ov ) ;

// 由於此時hevent=null,所以同步物件為hfile,下面兩句的效果一樣

waitforsingleobject ( hfile, infinite ) ;

**:

dword    nreadbyte ;

byte    bbuf1[buf_size],bbuf2[buf_size],bbuf3[buf_size] ;

readfile ( hfile, bbuf1, sizeof(bbuf1), &nreadbyte, &ov1 ) ;

readfile ( hfile, bbuf2, sizeof(bbuf2), &nreadbyte, &ov2 ) ;

readfile ( hfile, bbuf3, sizeof(bbuf3), &nreadbyte, &ov3 ) ;

//假設三個i/o處理的時間比較長,到這裡還沒有結束

**:

dword    nreadbyte ;

byte    bbuf1[buf_size],bbuf2[buf_size],bbuf3[buf_size] ;

handle   hevent1 = createevent ( null, false, false, null ) ;

handle   hevent2 = createevent ( null, false, false, null ) ;

handle   hevent3 = createevent ( null, false, false, null ) ;

readfile ( hfile, bbuf1, sizeof(bbuf1), &nreadbyte, &ov1 ) ;

readfile ( hfile, bbuf2, sizeof(bbuf2), &nreadbyte, &ov2 ) ;

readfile ( hfile, bbuf3, sizeof(bbuf3), &nreadbyte, &ov3 ) ;

//此時3個i/o操作的同步物件分別為hevent1,hevent2,hevent3

**:

void ccompletionroutinedlg::ontest()

deletefile ( "a.txt" ) ;

deletefile ( "b.txt" ) ;

deletefile ( "c.txt" ) ;

}

執行後的效果如下(winxp+sp2+vc6.0):

4、   心得體會

每當乙個io操作結束時會產生乙個完成資訊,如果該io操作有完成例程的話就新增到完成例程佇列。一旦呼叫執行緒進入可變等待狀態,就會依次執行佇列中的完成例程。

在這個示例中還有乙個問題,如果把這個軟體放在系統分割槽的檔案目錄下可以正常執行,而放在其他碟符下就會出現問題,執行結果就不同,真是奇怪了。

四、使用完成埠(iocp)

例項二、使用iocp的非同步i/o示例

1、設計目標

體會完成埠的非同步i/o實現原理及過程。

2、   問題的分析與設計

說明:每個客戶端與乙個管道進行互動,而在互動過程中i/o操作結束後產生的完成包就會進入「i/o完成包佇列」。完成埠的執行緒佇列中的執行緒使用getqueuedcompletionstatus來檢測「i/o完成包佇列」中是否有完成包資訊。 

3、詳細設計(關鍵**如下,具體見附件中的原始碼)

**:

uint serverthread ( lpvoid lpparameter )

return 0 ;

}void cmydlg::onstart()

// 建立執行緒

for ( i = 0; i < nmaxthread; i++ )

……}void cmydlg::onstop()

for ( i = 0; i < nmaxpipe; i++ )……}

(bbs.pediy.com) 及作者,並保持文章的完整性。

(看雪)

Windows系統程式設計之非同步I O和完成埠

標 題 windows系統程式設計之非同步i o和完成埠 作 者 北極星2003 時 間 2006 07 02 18 46 鏈 接 詳細資訊 windows系統程式設計之非同步i o和完成埠 dword nreadbyte byte bbuf buf size readfile hfile,bbuf...

Windows系統程式設計之非同步I O和完成埠

windows系統程式設計之非同步i o和完成埠 dword nreadbyte byte bbuf buf size readfile hfile,bbuf,sizeof bbuf nreadbyte,ov 由於此時hevent null,所以同步物件為hfile,下面兩句的效果一樣 waitfo...

系統程式設計之檔案系統程式設計

系統呼叫 所有的作業系統都提供多種服務的入口點,程式由此向核心請求服務。這些可直接進入核心的入口點被稱為系統呼叫。不同作業系統提供了自己的一套系統呼叫,所以系統呼叫無法實現跨平台使用。而且頻繁地系統呼叫,在使用者態和核心態之間切換,很耗費資源,效率不高。c標準庫提供了操作檔案的標準i o函式庫,與系...