不知道你是否還記得執行緒中的 pthread_join 函式,它可以等待指定的執行緒完成結束後才會返回。同樣的,在非同步 io 中,也有乙個函式,但是它不是 aio_join,而是 aio_suspend,它會一直等待,直到指定的非同步 io 操作完成才返回。
int aio_suspend(const struct aiocb * const aiocb_list, int nitems, const struct timespec *timeout);
(1)引數這個函式引數看起來有點複雜,不過仔細看,實際上就是乙個 aiocb 結構的指標陣列。
(2)函式語義
aio_suspend 函式會阻塞呼叫執行緒,直到發生下面的事情:
接下來看例子吧^_^
同樣是對前面程式的修改。
#include #include #include #include #include #include #include #include #include #define err_exit(msg) do while(0)
int main() ;
//將其中一元素賦值,不一定是第乙個
aio_list[4]=&my_aiocb;
ret=aio_suspend(aio_list,5,null);
if(ret<0)
printf("aio_suspend return\n");
// 不斷的檢查非同步讀的狀態,如果返回 einprogress,說明非同步讀還沒完成
// 輪詢檢查狀態是一種很笨的方式,其實可以讓作業系統用訊號的方式來通知,或者讓作業系統完成讀後主 動建立乙個執行緒執行。
while(aio_error(&my_aiocb) == einprogress)
ret=aio_return(&my_aiocb);
if(ret<0)
// 列印緩衝區內容,你並不知道核心是什麼時候將緩衝區中的 hello 複製到你的 buf 中的。
printf("content: %s,return:%d\n", buf,ret);
return 0;
}
編譯與執行
圖1執行結果
啟動程式後,程式首先會在 aio_suspend 處阻塞,在終端輸入hello world 後,aio_suspend 就返回了。
2-posix 非同步io(非同步操作狀態)
4-posix 非同步io(批量請求)
**:
2 POSIX 非同步IO 非同步操作狀態
當你使用 aio read 或 aio write 等函式發起了非同步讀或寫時,核心就自己去幹活了,假設你目前還不知道非同步通知的方法,你就只能不斷的詢問核心 你讀完沒?正如同前面的那段程式 不斷的檢查非同步讀的狀態,如果返回 einprogress,說明非同步讀還沒完成 輪詢檢查狀態是一種很笨的方...
POSIX多執行緒 非同步程式設計舉例
整半年沒有更新,發幾篇以前的讀書筆記。content 0.序 1.基本的同步版本 2.多程序版本 3.多執行緒版本 4.小結 0.序 本節通過乙個簡單的鬧鐘例項演示非同步程式設計方法。該程式迴圈接受使用者輸入資訊,直到出錯或者輸入完畢。使用者輸入的每行資訊有兩部分 鬧鐘等待的時間 秒 和鬧鐘時間到達...
Unix環境變數 POSIX非同步I O
非同步 i o 是針對同步 i o 提出的概念,它不需要執行緒等待 i o 結果,而只需要請求進行傳輸,然後系統會自動完成 i o 傳輸,結束或者出現錯誤時會產生相應的 i o 訊號,使用者程式只需要設定好對應的訊號陷入函式,即可處理乙個非同步 i o 事件。include struct aiocb...