3 POSIX非同步IO 等待非同步操作

2021-08-26 20:16:01 字數 1340 閱讀 5336

不知道你是否還記得執行緒中的 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...