linux新增特性eventfd

2021-07-07 02:54:57 字數 1557 閱讀 6448

首先說明的一點是eventfd是用來實現多程序或多執行緒的之間的事件通知的,那麼我們在沒接觸eventfd之前用到的事件通知機制都有那些?

1.條件變數

2.管道

我們來逐一比較此倆中機制與eventfd的效果方面的好壞,首先,條件變數必須和互斥鎖結合使用,使用起來麻煩,而且效能未必比eventfd好,其次條件變數不能像eventfd一樣為i/o事件驅動,因此不能和伺服器的i/o模式很好的融合,所以在某些時候不如eventfd好用

接著是管道,雖然管道能與i/o復用很好的融合,但很明顯管道相比eventfd多用了乙個檔案描述符,而且管道的話核心還得給其管理的緩衝區,eventfd則不需要,所以單純作為事件通知的話還是管道好用

eventfd只有乙個介面,形式如下

int eventfd(unsigned

int initval, int flags);

//成功返回事件驅動的檔案描述符

eventfd()建立乙個檔案描述符,這個檔案描述符使用者可以通過等待其可讀來實現事件通知,該通知靠核心來響應使用者空間的應用事件。上述介面的第乙個引數是乙個由核心來保持的64位計數器,這個計數器有引數initval來初始化,關於此計數器的影響我在下文中的具體例項中給大家演示,一般我們可將其設為0

第二個引數flags可以為efd_nonblock或efd_cloexec,其含義分別為阻塞檔案描述符,和與普通檔案的cloexec標誌一樣的功能(這裡不想詳細將cloexec有興趣的我之前寫檔案的基本操作的博文裡有它的詳細解釋)

#include 

#include

#include

#include

int fd;

uint64_t buffer;

void threadfunc(void) //執行緒函式

printf("t = %llu buffer = %llu\n",t,buffer);

if(t == 8)

}

}int main(void)

//建立執行緒

if(pthread_create(&tid,null,threadfunc,null) < 0)

while(1)

sleep(2); //沒2s通知一次

}return

0;}

上述**中,我們建立乙個執行緒,通過主線程往fd裡寫資料,來通知另乙個執行緒。

**執行結果如下

關於eventfd中的initval引數的作用,我的測試結果如下,前提把上述**eventfd函式中的0改為3

可以看出這個由核心管理的計數器,我們的初始化值,只會影響程式第一次buffer的值,後續buffer中的值依然為1.

linux新增特性timerfd

linux2.6.25版本新增了timerfd這個供使用者程式使用的定時介面,這個介面基於檔案描述符,當超時事件發生時,該檔案描述符就變為可讀。我首次接觸這個新特性是在muduo網路庫的定時器裡看到的,那麼新增乙個這樣的定時器介面有什麼意義呢?要說明這個問題我得先給大家列舉一下linux下能實現定時...

Linux 2 6 35 新增特性 RPS RFS

本帖最後由 lenky0401 於 2010 08 15 23 02 編輯 懶得拷貝了 主要是試了拷貝,竟然拷貝不了,突然感覺還是qq空間發表日誌時的貼上功能強大,連文字帶圖一起拷貝過去了,之後還提示是否要把給抓取過來存到qq相簿 原文 linux 2.6.35於2010年8月1號發布,新增特性比較...

C 新增特性

引用申明 資料型別 引用名 變數名 1 在進行實參和形參的結合時,不會為形參分配記憶體空間,而是將形參作為實參的乙個別名,即在記憶體中沒有產生實參的副本,而使用一般變數傳遞函式引數時,發生函式呼叫時,是需要給形參分配儲存單元的。2 用引用能達到用指標傳遞的一樣效果,形參改變會影響實參。在主調函式的呼...