Linux 新的事件等待 響應機制eventfd

2021-09-01 21:59:37 字數 3568 閱讀 2335

常用的程序/執行緒間通訊機制有管道、訊號量、訊息佇列、訊號、共享記憶體、socket等等,其中主要作為程序/執行緒間通知/等待的有管道pipe和socket。從linux 2.6.27版本開始增加了eventfd,主要用於程序或者執行緒間的通訊(如通知/等待機制的實現)。

注:eventfd用於程序/執行緒間通訊,效率比pipe高

(1) eventfd()函式介紹:建立乙個檔案描述符efd,用於事件通知,該檔案描述符能被使用者空間當作乙個事件等待/響應機制

(2) efd可以像普通的檔案描述符一樣,用epoll_wait進行監聽:當epoll_wait檢測到efd可讀時,說明當前執行緒被其他執行緒通知notify

(2) efd的全部緩衝區大小只有定長8byte

*     #include 

*int

eventfd

(unsigned

int initval,

int flags)

;* 引數說明:

* initval,初始化計數器的值。

* flags, efd_nonblock,設定socket為非阻塞。

* efd_cloexec,執行fork的時候,在父程序中的描述符會自動關閉,子程序中的描述符保留。

先來看看eventfd函式的用法,直接上示例:

[

~/test]# .

/efd 123

parent about to read 父程序,阻塞在read,等待子程序向eventfd中寫入資料

child writing 1 to efd

child writing 2 to efd

child writing 3 to efd

child completed write loop

parent read 6

(0x6

) from efd 父程序,被喚醒,read =1+

2+3=

6#include

#include

#include

#include

#include

/* definition of uint64_t */

#define handle_error(msg) \

do while (0)

intmain

(int argc,

char

*argv)

efd =

eventfd(0

,0);

// efd_cloexec efd_nonblock efd_semaphore

if(efd ==-1

)handle_error

("eventfd");

switch

(fork()

)printf

("child completed write loop\n");

exit

(exit_success)

;default

:// 父程序

while(1

)case-1

:handle_error

("fork");

}}

#include

#include

#include

#include

#include

#include

#include

int efd =-1

;void

*read_thread

(void

*dummy)

ep_fd =

epoll_create

(1024);

if(ep_fd <0)

}while(1

)else

if(events[i]

.events & epollerr)

else

if(events[i]

.events & epollin)

else}}

}else

if(ret ==0)

else

} fail:

if(ep_fd >=0)

return

null;}

intmain

(int argc,

char

*argv)

ret =

pthread_create

(&pid,

null

, read_thread,

null);

if(ret <0)

for(i =

0; i <

5; i++

)else

sleep(1

);} fail:if(

0!= pid)

if(efd >=0)

return ret;

}

輸出結果如下所示:

success write to efd, write 8

bytes(4

) at 1328805612s 21939us

success read from efd, read 8

bytes(4

) at 1328805612s 21997us

success write to efd, write 8

bytes(4

) at 1328805613s 22247us

success read from efd, read 8

bytes(4

) at 1328805613s 22287us

success write to efd, write 8

bytes(4

) at 1328805614s 22462us

success read from efd, read 8

bytes(4

) at 1328805614s 22503us

success write to efd, write 8

bytes(4

) at 1328805615s 22688us

success read from efd, read 8

bytes(4

) at 1328805615s 22726us

success write to efd, write 8

bytes(4

) at 1328805616s 22973us

success read from efd, read 8

bytes(4

) at 1328805616s 23007us

epoll wait timed out

不難發現,通過eventfd建立的描述符efd,讀/寫大小為sizeof(uint_64)資料,就可以完成兩個執行緒間的喚醒。比如上述例子,由於epoll_wait()的等待,pthread_create出來的執行緒阻塞,在主線程中,通過往eventfd中write資料,使描述符可讀,epoll返回,這就達到了喚醒的目的。

vtk事件響應機制

vtk中大致有三種時間響應機制 command observer模式之callback function vtk中的command observer模式是最常用的,也是各種處理方式的基礎。這裡首先介紹如何使用callback function的方法 void keypresscallbackfunc...

Linux等待佇列機制

1.linux核心等待佇列機制 1.1.概念 明確 等待分為忙等待和休眠等待 等待 期望某個事件發生 事件 比如按鍵有操作,串列埠有資料,網路有資料 明確 阻塞一般是指休眠等待 明確 程序的狀態 1.程序的準備就緒狀態 task ready 2.程序的執行狀態 task running 3.程序的休...

jQuery新的事件繫結機制on

今天瀏覽jquery的deprecated列表,發現live 和die 在裡面了,趕緊看了一下,發現從jquery1.7開 始,jquery引入了全新的事件繫結機制,on 和off 兩個函式統一處理事件繫結。因為在此之前有bind live delegate 等方法來處理事件繫結,jquery從效能...