常用的程序/執行緒間通訊機制有管道、訊號量、訊息佇列、訊號、共享記憶體、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從效能...